전체 목록
백엔드Hard#431

Outbox Pattern은 어떤 문제를 해결하며 메시지 큐와 함께 어떻게 사용하나요?

#백엔드#OutboxPattern#MessageQueue#트랜잭션

답변 포인트

DB 저장은 성공했는데 이벤트 발행은 실패하는 상황을 생각해보세요.

정답 및 해설

빠른 요약

Outbox Pattern은 데이터베이스 변경과 이벤트 발행 사이의 불일치를 줄이기 위한 패턴입니다. 예를 들어 주문 저장은 성공했는데 Kafka나 메시지 큐 발행이 실패하면, 시스템마다 주문 상태를 다르게 알 수 있습니다.

Outbox Pattern은 데이터베이스 변경과 이벤트 발행 사이의 불일치를 줄이기 위한 패턴입니다. 예를 들어 주문 저장은 성공했는데 Kafka나 메시지 큐 발행이 실패하면, 시스템마다 주문 상태를 다르게 알 수 있습니다.

해결 방식은 단순하지만 효과적입니다. 비즈니스 데이터와 함께 “발행해야 할 이벤트”를 같은 DB 트랜잭션 안에서 outbox 테이블에 저장합니다. 이후 별도의 relay worker가 outbox 테이블을 읽어 메시지 브로커로 발행하고, 성공하면 발행 완료로 표시합니다.

Text
[  ]
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 모니터링, 중복 처리, 지연 시간 같은 운영 복잡도가 추가된다는 점입니다.

관련 질문

같은 카테고리/태그 기준