피드로 돌아가기
Dev.toBackend
원문 읽기
FOR UPDATE SKIP LOCKED와 Exponential Backoff를 통한 Production-ready Outbox 패턴 구축
I kept improving my .NET order pipeline after a CTO left feedback. Here is where it ended up.
AI 요약
Context
PostgreSQL과 Kafka 기반의 Event-driven order pipeline에서 Outbox 패턴을 사용했으나, 수평 확장 시 메시지 중복 처리 및 Broker 장애 시 시스템 부하 가중 문제 발생. 특히 실패 메시지의 가시성 부재로 인한 운영 효율 저하가 주요 병목 지점으로 분석됨.
Technical Solution
- FOR UPDATE SKIP LOCKED 쿼리 도입을 통한 Poller 간 행 잠금 충돌 방지 및 수평 확장성 확보
- Kafka Connection failure 시 대기 시간을 5초에서 최대 60초까지 2배수 증가시키는 Exponential Backoff 로직 적용
- Payload 역직렬화 오류와 인프라 장애를 구분하여, 데이터 결함 메시지가 전체 파이프라인 지연을 유발하지 않도록 처리 분리
- 최대 3회 재시도 실패 메시지를 DeadLetterMessages 테이블로 격리하는 Dead Letter Path 구축
- 운영자의 신속한 장애 분석을 위한 Dead Letter 전용 API 엔드포인트 설계
실천 포인트
- Outbox Poller 설계 시 분산 환경에서의 동시성 제어를 위해 SKIP LOCKED 옵션 검토 - 외부 메시지 브로커 장애 전파 방지를 위해 고정 지연 시간이 아닌 Exponential Backoff 전략 채택 - 재시도 횟수 제한 후 메시지를 별도 저장소로 격리하는 DLQ(Dead Letter Queue) 메커니즘 구현 - 인프라 장애와 비즈니스/데이터 오류를 구분하여 서로 다른 재시도 정책 적용