피드로 돌아가기
Dev.toBackend
원문 읽기
분산 환경의 중복 실행 제거를 위한 Cron 구조의 구조적 전환
Cuatro intentos para que una tarea programada se ejecute exactamente una vez: una evolución
AI 요약
Context
FastAPI 기반 3개 Replica 환경에서 Worker Loop 내 Wall-clock 기반 스케줄링을 구현한 구조. 분산 락과 Idempotency 체크 로직을 적용했으나, 트랜잭션 범위와 비동기 처리의 틈새로 인해 동일 작업이 최대 3회 중복 실행되는 현상 발생.
Technical Solution
- pg_try_advisory_xact_lock 도입을 통한 동시 실행 제어 시도 및 트랜잭션 종료 후 락 해제로 인한 순차적 중복 실행 한계 확인
- 비즈니스 데이터 기반 Sentinel 체크 로직 구현 및 외부 API 호출 실패 시 상태 미반영으로 인한 Idempotency 보장 실패 분석
- Worker_runs 테이블 내 INSERT ... ON CONFLICT DO NOTHING 구문을 활용하여 작업 할당과 실행 상태를 원자적으로 결합
- 내부 스케줄링 로직을 완전히 제거하고 AWS EventBridge와 ECS Ephemeral Container 조합의 외부 트리거 구조로 전환
- 인프라 레벨의 스케줄링을 통해 Replica 간의 실행 주체 결정 문제를 근본적으로 제거한 Architecture 설계
실천 포인트
1. 분산 락 도입 전 INSERT ... ON CONFLICT 기반의 원자적 상태 관리가 가능한지 검토할 것
2. '성공 시에만 상태 업데이트' 하는 Sentinel 방식 대신 '작업 할당과 상태 변경'을 하나의 트랜잭션으로 묶을 것
3. Application 내부에 구현된 Wall-clock 기반 스케줄러를 EventBridge 등 검증된 외부 스케줄러로 대체할 것