Outbox Pattern은 어떤 문제를 해결하며 메시지 큐와 함께 어떻게 사용하나요?
답변 포인트
DB 저장은 성공했는데 이벤트 발행은 실패하는 상황을 생각해보세요.
정답 및 해설
빠른 요약
Outbox Pattern은 데이터베이스 변경과 이벤트 발행 사이의 불일치를 줄이기 위한 패턴입니다. 예를 들어 주문 저장은 성공했는데 Kafka나 메시지 큐 발행이 실패하면, 시스템마다 주문 상태를 다르게 알 수 있습니다.
Outbox Pattern은 데이터베이스 변경과 이벤트 발행 사이의 불일치를 줄이기 위한 패턴입니다. 예를 들어 주문 저장은 성공했는데 Kafka나 메시지 큐 발행이 실패하면, 시스템마다 주문 상태를 다르게 알 수 있습니다.
해결 방식은 단순하지만 효과적입니다. 비즈니스 데이터와 함께 “발행해야 할 이벤트”를 같은 DB 트랜잭션 안에서 outbox 테이블에 저장합니다. 이후 별도의 relay worker가 outbox 테이블을 읽어 메시지 브로커로 발행하고, 성공하면 발행 완료로 표시합니다.
[주문 생성 트랜잭션]
1. orders insert
2. outbox_events insert
3. commit
[relay]
1. unpublished events 조회
2. message broker 발행
3. published 처리이렇게 하면 적어도 DB에 주문이 저장된 이벤트를 잃어버리지는 않습니다. 물론 메시지가 중복 발행될 수 있으므로 consumer는 idempotent하게 만들어야 합니다.
Outbox Pattern은 분산 트랜잭션을 피하면서 신뢰성 있는 이벤트 기반 아키텍처를 만들 때 자주 사용됩니다. 단점은 outbox 테이블 관리, relay 모니터링, 중복 처리, 지연 시간 같은 운영 복잡도가 추가된다는 점입니다.