WEBBOOK CHAPTER

NestJS 11, 시작부터 런칭까지: 33장. Outbox와 Queue의 책임을 나눈다

33장. Outbox와 Queue의 책임을 나눈다

Dispatch 명령이 DB Outbox, Queue, Worker와 WebSocket으로 전달되는 경계
Dispatch 명령이 DB Outbox, Queue, Worker와 WebSocket으로 전달되는 경계

업무 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가 필요하다.