WEBBOOK CHAPTER

실패를 전제로 설계하는 분산시스템: 8장. Outbox로 DB 변경과 이벤트를 잇는다

8장. Outbox로 DB 변경과 이벤트를 잇는다

예약 DB commit 뒤 메시지 발행이 실패하면 알림과 정산이 사라진다. DB와 broker에 분산 트랜잭션을 걸기보다 업무 변경과 outbox 레코드를 같은 트랜잭션으로 저장하고 별도 publisher가 전달한다.


begin;
update reservation set status='confirmed' where id=:id;
insert into outbox(event_id, aggregate_id, event_type, payload, occurred_at)
values(:eventId,:id,'ReservationConfirmed',:payload,clock_timestamp());
commit;

publisher는 중복 발행될 수 있으므로 소비자는 event ID를 기억하거나 결과 쓰기를 멱등하게 만든다. outbox 적체, poison event, 스키마 변경, 보관과 재생 권한도 운영 대상이다. “eventual consistency”라는 말로 지연 상한을 숨기지 않는다.