33장. Outbox와 Queue의 책임을 나눈다
업무 transaction은 Dispatch·StatusEvent·Outbox를 함께 commit한다. Publisher는 FOR UPDATE SKIP LOCKED 또는 lease로 row를 가져와 broker에 event id를 보내고 publish receipt를 기록한다. broker consumer는 적어도 한 번 받을 수 있으므로 event id와 업무 key로 효과를 dedup한다. “exactly once” 설정 이름으로 외부 SMS 중복을 감추지 않는다.
event envelope에는 id, type, version, aggregate id/version, occurredAt, trace context를 둔다. 소비자가 구·신 version을 함께 읽는 기간을 두고 producer보다 consumer를 먼저 배포한다. payload에 고객 주소 전체를 복제하지 않고 필요한 참조와 최소 데이터를 쓴다.
실습은 publish 성공 뒤 DB update 실패, consumer 처리 성공 뒤 ack 단절, 429, poison payload를 주입한다. queue count뿐 아니라 oldest age, retry, DLQ, Dispatch와 provider receipt 대사를 본다. DLQ replay는 dry run, 대상 filter, idempotency 확인, 승인, 결과 audit가 필요하다.