피드로 돌아가기
Dev.toBackend
원문 읽기
PostgreSQL ACID 기반 원자적 락을 통한 고가용성 분산 스케줄러 구현
Building TaskForge: Translating Enterprise Chaos into an Open-Source Scheduler
AI 요약
Context
Cassandra 기반의 무마스터 구조에서 전역 원자적 락(Global Atomic Lock) 구현 시 발생하는 병목 현상과 아키텍처적 복잡성 인지. 분산 환경의 비동기 워크플로우 처리 중 발생하는 데이터 정합성 문제와 Worker Crash 대응의 한계를 극복하고자 함.
Technical Solution
- ACID 보장을 위해 DB 엔진을 PostgreSQL로 교체하여 Race Condition을 원천 차단한 구조 설계
- SELECT ... FOR UPDATE SKIP LOCKED 구문을 활용해 여러 Scheduler 인스턴스가 상호 간섭 없이 PENDING 작업을 병렬 처리하는 메커니즘 도입
- UPDATE 문에 상태 조건(status = 'PROCESSING')을 결합한 Atomic Worker Claim 쿼리로 중복 실행 방지 및 정합성 확보
- RabbitMQ의 prefetch(1) 설정과 Dead-Letter Queue(DLQ) 구성을 통해 Worker 과부하 방지 및 장애 메시지 격리
- DB 업데이트 후 Queue 발행 실패로 인한 유실을 해결하기 위해 Stale Lease Recovery Sweeper를 통한 상태 복구 로직 구현
- Exponential Backoff 알고리즘을 적용한 재시도 메커니즘으로 외부 API 장애 시 시스템 부하를 최소화하는 Penalty Box 구조 설계
실천 포인트
1. 분산 락 구현 시 NoSQL의 제약 사항과 RDBMS의 SKIP LOCKED 성능 이점을 비교 검토했는가?
2. Message Broker 도입 시 At-Least-Once 전달 특성에 따른 비즈니스 로직의 Idempotency를 보장했는가?
3. DB-to-Queue 간 발행 간극을 메울 수 있는 Outbox Pattern 또는 Recovery Sweeper가 설계에 포함되었는가?
4. Worker의 갑작스러운 종료를 대비한 Graceful Shutdown 및 OS 시그널 핸들링 처리가 되어 있는가?