요약
- 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 필요