WEBBOOK CHAPTER

Spring Boot 4.1, 시작부터 런칭까지: 30장. Outbox로 외부 알림 유실을 막는다

30장. Outbox로 외부 알림 유실을 막는다

업무 table commit 뒤 바로 broker publish를 하면 commit과 publish 사이 crash에서 event가 사라진다. CrewLink는 같은 DB transaction에 outbox id, aggregate id, event type/version, payload, created time을 insert한다. publisher는 미처리 row를 lease하고 전송 뒤 상태를 기록한다. provider가 받았지만 응답이 끊겨도 event id를 dedup key로 재전송한다.

CrewLink 명령이 트랜잭션과 Outbox를 거쳐 외부 알림으로 전달되는 흐름
CrewLink 명령이 트랜잭션과 Outbox를 거쳐 외부 알림으로 전달되는 흐름

payload에는 entity snapshot 전체보다 consumer 계약에 필요한 식별자와 version을 넣는다. schema evolution과 개인정보 최소화를 고려한다. poison event는 무한 retry하지 않고 횟수·backoff·dead-letter와 수동 재처리 승인 절차를 둔다. backlog age는 단순 row 수보다 사용자 지연을 잘 보여 준다.

실습은 DB commit 직후 publisher 종료, provider 429, provider 성공 뒤 timeout, 잘못된 payload를 주입한다. 최종 조건은 외부 receipt 1건, 업무 row 일치, outbox 상태 설명 가능, alert 전달이다. table을 수동으로 SENT로 고치는 대신 승인된 replay command와 audit를 사용한다.