
백엔드
@Scheduled 한 줄로 버티다, 트리거를 밖으로 꺼낸 이야기
두줄요약
@Scheduled 기반 배치가 Pod 확장 시 중복 실행과 유실 문제를 드러내자, 트리거를 애플리케이션 밖으로 분리했습니다. 실행은 선점과 체크포인트로 나눠 맡겨 여러 Pod가 작업을 분담하도록 전환했습니다.
문제 상황
- @Scheduled 기반 배치가 대상 증가로 회차당 8분까지 늘어나 다음 주기와 겹치는 상황
- Pod를 늘려도 처리량은 오르지 않고 같은 작업만 여러 번 실행되는 중복 문제
- 스케줄이 애플리케이션 인스턴스에 묶여 있어 장애나 전체 종료 시 회차 유실 가능성 존재
원인 분석
- 스케줄러와 실행 로직이 같은 Pod 안에 상주해 인스턴스 복제 시 스케줄도 함께 복제되는 구조
- 멱등 처리나 락은 결과 중복은 줄이지만 작업 분산과 유실 방지는 해결하지 못하는 한계
- 인스턴스 내부 스케줄 구조에서는 실행 주체 부재 시 회차를 붙들어 두지 못함
해결 방법
- 트리거를 애플리케이션 밖의 스케줄러로 분리해 인스턴스 생명주기와 독립적으로 관리
- 실행 단계는 공유 저장소 기반 선점으로 여러 Pod가 작업을 나눠 갖도록 구성
- 체크포인트와 하트비트로 재개 좌표와 생존 상태를 관리해 실패 시 이어받기와 재시도 지원



