Skip to content

seunghw2/BeFresh_SpringBatch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🥦 Be Fresh - Spring Batch 리팩터링 프로젝트

프로젝트 개요

  • 기존 Be Fresh 프로젝트의 Spring Batch를 추가 학습 및 리팩터링하기 위한 프로젝트
  • 👪 기관: 삼성 청년 SW 아카데미
  • 📆 개발 기간: 2024.04.08 ~ 2024.05.20
  • 📆 리팩터링 기간: 2024.08 ~ Now

리팩터링 목표

  1. Spring Batch 제대로 이해하고 구현하기
  2. 약 10만개의 알림 발송을 빠르게 처리하기

스프링 배치 주요 프로세스

  1. Reader : DB에서 신선도가 주의 상태인 모든 음식을 조회
  2. Processor : 사용자에게 발송할 알림 객체 생성
  3. Writer : FCM 알림 발송 및 DB의 알림 테이블에 데이터 추가

리팩터링 과정

1. 병렬 처리

  • FCM 알림 발송이 순차적으로 이루어져 처리 시간이 오래 걸렸습니다.
  • 또한, FCM 알림과 같은 I/O 작업은 네트워크 지연으로 인해 CPU가 대기 시간 동안 비활성 상태로 남아있는 경우가 많았습니다.
  • 이를 해결하기 위해 @Async를 사용한 병렬 처리를 도입했습니다.

성능 비교

  • 단위 : ms
  • 100,000개 데이터 기준, 약 97% 성능 향상
데이터 개수 1,000개 10,000개 100,000개
기존 방식 81205 766893 7261820
병렬 처리 도입 (corePoolSize : 50) 2248 20701 215441

2. Batch Insert

  • 기존에는 알림 객체마다 개별적으로 DB에 Insert 쿼리를 보내는 방식으로 처리했습니다.
  • Spring Batch 공식 문서를 통해 JDBCBatchItemWriter를 사용해 지정된 청크 크기만큼 쿼리를 한 번에 모아 전달할 수 있다는 점을 알게 되었고, 이를 기반으로 리팩터링을 진행했습니다.

3. Tasklet → Chunk Oriented Processing

  • 기존의 Tasklet 방식으로 구현된 StepChunk-Oriented Processing 방식으로 변경했습니다.
  • 현재 로직은 다중 작업에 가깝고, 10만개 이상의 음식을 관리하는 것이 목표였기 때문에 Chunk-Oriented Processing 방식으로 변경했습니다.

4. Retry Logic 구현

  • FCM 알림 전송 과정에서 발생할 수 있는 오류 중 하나로 Internal Server Error가 있습니다.
  • 이는 FCM 내부 서버의 문제로 발생하는 오류이며, FCM 공식 문서에서 재시도를 권장하고 있어 이를 대비한 재시도 로직을 구현했습니다.

About

기존 BeFresh의 Spring Batch 관련 Refactor 및 공부를 위한 프로젝트

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages