- 기존 Be Fresh 프로젝트의 Spring Batch를 추가 학습 및 리팩터링하기 위한 프로젝트
- 👪 기관: 삼성 청년 SW 아카데미
- 📆 개발 기간: 2024.04.08 ~ 2024.05.20
- 📆 리팩터링 기간: 2024.08 ~ Now
- Spring Batch 제대로 이해하고 구현하기
- 약 10만개의 알림 발송을 빠르게 처리하기
- Reader : DB에서 신선도가 주의 상태인 모든 음식을 조회
- Processor : 사용자에게 발송할 알림 객체 생성
- Writer : FCM 알림 발송 및 DB의 알림 테이블에 데이터 추가
- FCM 알림 발송이 순차적으로 이루어져 처리 시간이 오래 걸렸습니다.
- 또한, FCM 알림과 같은 I/O 작업은 네트워크 지연으로 인해 CPU가 대기 시간 동안 비활성 상태로 남아있는 경우가 많았습니다.
- 이를 해결하기 위해
@Async를 사용한 병렬 처리를 도입했습니다.
성능 비교
- 단위 : ms
- 100,000개 데이터 기준, 약 97% 성능 향상
| 데이터 개수 | 1,000개 | 10,000개 | 100,000개 |
|---|---|---|---|
| 기존 방식 | 81205 | 766893 | 7261820 |
병렬 처리 도입 (corePoolSize : 50) |
2248 | 20701 | 215441 |
- 기존에는 알림 객체마다 개별적으로 DB에 Insert 쿼리를 보내는 방식으로 처리했습니다.
- Spring Batch 공식 문서를 통해
JDBCBatchItemWriter를 사용해 지정된 청크 크기만큼 쿼리를 한 번에 모아 전달할 수 있다는 점을 알게 되었고, 이를 기반으로 리팩터링을 진행했습니다.
- 기존의
Tasklet방식으로 구현된Step을Chunk-Oriented Processing방식으로 변경했습니다. - 현재 로직은 다중 작업에 가깝고, 10만개 이상의 음식을 관리하는 것이 목표였기 때문에
Chunk-Oriented Processing방식으로 변경했습니다.
- FCM 알림 전송 과정에서 발생할 수 있는 오류 중 하나로
Internal Server Error가 있습니다. - 이는 FCM 내부 서버의 문제로 발생하는 오류이며, FCM 공식 문서에서 재시도를 권장하고 있어 이를 대비한 재시도 로직을 구현했습니다.