TechFeedTechFeed
Backend

배치 잡, 크론, 데드 레터, 멱등 | 스케줄러 장애 전에 채울 항목은?

배치 잡·크론 스케줄러 운영 체크리스트다. 잡 인벤토리, 동시 실행 방지(분산 락), 멱등 키, 데드 레터 큐(DLQ), 시작·성공·실패·지연 메트릭, 청크·트랜잭션 경계, 15분 런북, PR 배포 게이트를 표와 목록으로 정리한다. 백엔드·API·큐·온콜·클라우드 스케줄·개발자 실무에서 자정 중복 정산·재시도 폭주·데이터 손상을 줄이는 점검 순서와 관측 항목.

by

자정 배치가 한 번 겹치면 중복 정산·중복 알림·락 대기로 아침 장애가 난다. 크론 문자열만 넣고 끝내는 팀은 멱등 키, 데드 레터 큐(DLQ), 실행 시간 상한, 동시 실행 금지를 비워 둔 경우가 많다. 클라우드 관리형 스케줄러를 쓰든 쿠버네티스 크론잡이든, 실패 모드는 같다. 아래 목록은 PR·런북에 그대로 붙일 수 있는 점검 항목이다.


웹훅 재시도는 멱등·폭주 케이스와, 알림·온콜 기준은 SLO·오류 예산과 같이 보면 빈칸이 줄어든다. 정산·리포트처럼 마감이 있는 잡은 “요청 가용성”이 아니라 “예정 시각 대비 완료 지연”으로 성공을 정의하는 편이 맞다.


잡 인벤토리 | 이름·주기·소유자부터 표로

스케줄러 장애의 절반은 “누가 돌리는 잡인지 모름”에서 시작한다. 서비스 단위로 한 장만 만들어도 온콜 시간이 줄어든다.


필드적을 내용왜 필요한가
잡 ID영문 고정 키(예: settle-daily-v2)로그·메트릭·알람 라벨 일치
주기크론 또는 고정 간격 + 타임존KST/UTC 혼선 방지
소유 팀온콜 채널·코드 오너실패 알림 수신자
부작용쓰기/외부 API/메일 여부멱등·재시도 정책 결정
SLA 감각지연 허용(분)·실패 시 비즈니스 영향페이지 vs 티켓 구분

스케줄·겹침 | 동시 실행을 막는 네 가지

주기가 5분인데 평균 실행이 7분이면 항상 겹친다. 크론 문법보다 “한 번에 하나만”이 먼저다. 멀티 파드·오토스케일 환경에서는 스케줄 트리거가 인스턴스 수만큼 복제되기도 한다. 중앙 스케줄러 한 곳만 발행하고 워커는 소비만 하게 나누면 중복 기동 면적이 줄어든다.


정각 동시 폭주도 흔하다. 매시 0분에 정산·캐시 워밍·리포트가 한꺼번에 붙으면 DB CPU와 외부 API 한도가 같이 터진다. 잡마다 분 단위 오프셋이나 지터를 주면 피크가 평탄화된다.


판정 규칙 — 평균 실행 시간이 주기의 50%를 넘기면 주기를 늘리거나 작업을 쪼갠다. “나중에 빨라지겠지”로 두지 않는다.


배치 작업 스케줄과 실행 시간이 겹치는 타임라인 다이어그램
주기보다 실행이 길면 락·skip 정책이 없으면 중복 쓰기가 난다

멱등·재시도 | 같은 날 두 번 돌아도 안전한가

네트워크 타임아웃 후 재시도는 거의 항상 온다. “성공했을 수도 있는 실패”를 전제로 설계한다. 외부 콜백과 같은 문제는 웹훅 멱등 키 글과 동일하다. 결제·포인트·알림처럼 부작용이 큰 경로는 유니크 제약 없이 재시도만 늘리면 비용 사고가 난다.


재시도 간격은 지수 백오프에 상한과 지터를 같이 둔다. 모든 워커가 같은 초에 다시 때리면 재시도 폭풍이 난다. 최대 시도 횟수를 넘기면 본 큐에서 빼고 DLQ로 보내 사람이 보게 한다.


부작용 유형멱등 키 후보비고
일 단위 정산business_date + job_id유니크 인덱스로 이중 insert 차단
행 단위 처리row_id + 처리 버전처리 완료 플래그·아웃박스
외부 API 호출Idempotency-Key 헤더상대가 지원하지 않으면 로컬 영수증 테이블
알림·메일template + 대상 + 일자중복 발송이 체감 장애

데드 레터 큐 | 실패를 버리는 곳이 아니라 대기열

DLQ는 휴지통이 아니다. 사람이 보고, 수정하고, 재투입하는 두 번째 파이프라인이다. 비어 있으면 좋은 날이 아니라, 모니터링이 꺼져 있을 수도 있다.


메시지 큐에서 실패한 작업이 데드 레터 큐로 이동하는 흐름도
DLQ 깊이·메시지 연령에 알람이 없으면 실패가 조용히 쌓인다

관측 | 시작·성공·실패·지연 네 숫자

잡마다 로그 문장만 찍으면 검색이 안 된다. 메트릭 네 개와 구조화 필드 몇 개면 온콜이 증상에서 원인으로 넘어간다. “배치 실패” 한 줄 알림보다 job_id·attempt·duration_ms·처리 건수가 붙은 이벤트가 원인 추적 시간을 줄인다.


완료 건수가 0인데 exit code 0인 실행을 성공으로 치면 안 된다. 비즈니스 검증(최소 처리 건수, 금액 합 범위, 행 수 급변)을 잡 끝에서 한 번 더 돌리고, 실패로 올려 DLQ·페이지와 연결한다.


함정 — “exit 0이면 성공”만 보면 부분 처리 실패를 놓친다. 비즈니스 결과(처리 건수 0인데 성공)도 실패로 칠 규칙을 코드에 넣는다.


데이터 안전 | 청크·트랜잭션·백필 경계

한 트랜잭션에 10만 행을 넣으면 락과 롤백 비용이 폭발한다. 배치 크기는 성능 튜닝이 아니라 장애 반경 조절이다. 청크 단위로 커밋하면 실패 지점부터 재개할 수 있고, 장시간 열린 트랜잭션이 일반 API 쓰기와 락을 다투는 시간도 줄어든다.


읽기 무거운 집계는 복제본·야간 윈도우·사전 집계 테이블 중 하나로 부하를 옮긴다. 백필은 일일 잡과 코드를 공유하되, 날짜 범위·쓰로틀·최대 건수 상수를 별도로 둔다. 실수로 전체 기간을 한 번에 돌리는 스위치를 기본값으로 켜 두지 않는다.


데이터베이스 배치 처리 청크와 트랜잭션 경계를 표시한 콘솔 화면
청크·타임아웃·건수 검증이 있으면 부분 실패를 조기에 끊을 수 있다

운영 런북 | 장애 15분에 할 일

자정 알람이 울렸을 때 위키를 검색하지 않게, 잡 ID별로 한 페이지를 둔다. 온콜 교대 시 “어제 정산 잡 상태”를 구두로만 넘기면 빈칸이 생긴다. 대시보드 링크·중지 방법·재투입 명령을 같은 문서에 모은다.


비즈니스 마감이 있는 잡은 지연 분 단위로 에스컬레이션 단계를 적는다. 예: 15분 지연은 엔지니어 티켓, 30분은 페이지, 60분은 사업 담당 공유. 숫자 없이 “빨리 봐줘”만 있으면 매번 논쟁이 난다.


배포 게이트 | 잡 코드 PR에서 막는 항목

애플리케이션 API PR과 같은 리뷰 기준으로는 부족하다. 스케줄·부작용이 있는 변경은 체크리스트 한 블록을 필수 코멘트로 둔다. 주기만 바꾼 PR도 겹침 시뮬레이션과 알람 임계 재검토가 필요하다.


첫 프로덕션 실행은 트래픽이 낮은 창에 두고, 담당자가 메트릭 화면을 보며 한 사이클을 지킨다. “배포 후 내일 아침 확인”은 이미 중복 정산이 끝난 뒤인 경우가 많다. 피처 플래그로 잡을 끈 상태로 배포한 뒤 플래그만 켜는 순서를 쓰면 롤백이 단순해진다.


참고 자료


내부 연계: 웹훅 멱등·재시도 · SLO·온콜 · 회로 차단기 · 카나리 배포 · Sentry


자주 묻는 질문

크론과 큐 워커 중 무엇을 써야 하나?

단순 주기·단일 작업은 크론(또는 관리형 스케줄러)으로 충분하다. 재시도·동시성·DLQ·우선순위가 필요하면 큐에 넣고 스케줄러는 “메시지 발행”만 담당하는 편이 안전하다. 둘을 섞을 때는 발행 쪽에도 멱등 키를 둔다.


동시 실행 금지(Forbid)만 켜면 멱등은 필요 없나?

아니다. 프로세스 킬·타임아웃·배포 중 이중 기동·수동 재실행은 락을 우회한다. 동시성 제어와 멱등 키는 다른 실패 모드를 막는다. 둘 다 넣는 것이 기본이다.


DLQ가 비어 있으면 건강한가?

실패가 없을 수도 있고, DLQ 라우팅이 안 붙어 있을 수도 있다. 의도적으로 실패하는 카나리 메시지 또는 스테이징 주입으로 “실패 → DLQ → 알람” 경로를 분기마다 검증한다.


배치 잡에도 SLO가 필요한가?

비즈니스 마감이 있는 잡(정산·정시 리포트·약관 갱신)은 “예정 시각 대비 완료 지연”을 SLI로 두는 편이 낫다. 요청 가용성 99.9%와 다른 시계열이다. 온콜 페이지 기준은 오류 예산 문서와 맞춰 둔다.


로컬에서는 잘 도는데 프로덕션만 타임아웃이다. 어디를 보나?

데이터 양, 인덱스 유무, 외부 API 한도, 연결 풀, 동시 잡 간섭을 순서대로 본다. 스테이징에 프로덕션에 가까운 건수로 재현하고 duration 메트릭을 청크 단위로 쪼개 보면 병목이 드러나는 경우가 많다.


실패한 날을 다음날 잡이 자동으로 메우게 해도 되나?

가능하지만 “어제 미완료 구간만” 집는 커서·business_date 범위가 명확해야 한다. 전체 재풀스캔은 비용과 중복 위험이 크다. 백필 잡과 일일 잡을 분리하고, 백필은 쓰로틀·건수 상한을 둔다.


배치 잡크론데드 레터멱등스케줄러백엔드API온콜개발자DLQ재시도

함께 보면 좋은 문제 해결

EXPLORE / Backend

이어서 읽어보기

전체 토픽 둘러보기