Outbox

Outbox는 DB 변경과 발행할 메시지 기록을 한 트랜잭션에 둔다

브로커 전송까지 원자적으로 묶는 패턴이 아니다. relay 재시도와 소비자 멱등성이 함께 있어야 운영에서 안전하다.

Local DB Transaction
orders: 주문 상태 COMMITTED
outbox: event_id, payload, NEW
Relay

NEW 이벤트를 읽어 브로커로 전송하고 SENT로 표시한다. 장애가 나면 같은 이벤트를 다시 보낼 수 있다.

Consumer

event_id 처리 이력이나 유니크 키로 중복 소비를 막는다.

보장

DB 변경과 “보낼 메시지” 누락을 함께 막는다.

남는 위험

메시지 중복 발행은 정상적인 실패 모드다.

필수 짝

consumer idempotency와 relay 관찰 지표가 필요하다.