Zettelkasten

Outbox Poller는 상태 변경을 먼저 하고 Queue에 넣는다

·수정 2026.04.23·수정 2

요약

  • Outbox Poller에서 "상태 변경(queuing) → Queue.send()" 순서를 지켜야 중복 발행을 방지할 수 있다
  • 역순(Queue 먼저)은 중복 발행이라는 더 심각한 문제를 야기한다

본문

순서가 중요한 이유

정순 (상태 변경 먼저 → Queue 나중)

  • Queue 전송 실패 시 rollback하면 됨
  • 시스템 장애로 queuing 상태에 stuck되어도 timeout으로 복구 가능

역순 (Queue 먼저 → 상태 변경 나중)

  • Queue에 메시지가 들어갔는데 상태 변경 실패 시
  • DB에서는 여전히 pending 상태 → 다음 polling에서 다시 발행
  • 중복 발행 문제 발생 (더 심각)

상태 흐름

pending → queuing → (queue 성공) → sent
                  → (queue 실패) → rollback → pending
                  → (시스템 장애) → timeout → pending (재시도)

장애 복구 전략

상태 변경 후 Queue.send() 전에 시스템이 죽으면 queuing 상태로 stuck됨.

해결책: Poller에서 주기적으로 timeout된 queuing 상태 레코드를 스캔

  • PENDING으로 되돌려 재시도
  • 또는 FAILED로 처리

동시성 제어 필요

여러 Poller 인스턴스가 동시에 같은 레코드를 처리하면 중복 발행됨.

  • Optimistic locking 또는 SELECT FOR UPDATE 필요

참고

이 문서를 참조하는 노트 (1)