서비스 DB의 로컬 트랜잭션
원자성
업무
orders.status = 결제완료
사용자가 기대하는 실제 상태 변경
사용자가 기대하는 실제 상태 변경
기록
event_id = evt_9421
발행할 이벤트와 payload를 같은 커밋에 저장
발행할 이벤트와 payload를 같은 커밋에 저장
브로커 전송까지 강제로 한 커밋에 넣지 않고, DB 안에 발행해야 할 이벤트를 남긴 뒤 릴레이와 소비자 멱등성으로 전달 실패를 흡수한다.
DB와 브로커를 하나의 커밋으로 묶지 않는 대신 재시도 가능한 기록을 남긴다.
릴레이 장애와 응답 유실 때문에 중복 발행 가능성을 정상 조건으로 둔다.
event_id 기반 처리 이력이 없으면 Outbox만으로 최종 일관성이 보장되지 않는다.