본문 바로가기

소프트웨어-이야기/아키텍처

Transactional outbox

Transactional outbox은 MSA 환경에서 이벤트 메시지 발행을 보장할 때 사용하는 패턴이다.

이벤트 메시지 발행 시점

애플리케이션에서 이벤트를 발행할 때에는 트랜잭션 내부 혹은 외부에서 호출하는 상황에 따라 장단점이 있다.

(1) 트랜잭션 안에서 메시지 발행
메시지 발행 여부를 쉽게 보장할 수 있다. 그러나 메시지 발행의 실패가 곧 전체 서비스로 장애가 전파될 수 있다는 단점이 있다.

(2) 트랜잭션 밖에서 메시지 발행
메시지 발행 실패가 즉시 해당 서비스의 장애로 전파되지 않는다. 그러나, 메시지 발행에 실패해도 메시지 발행을 재시도 할 수 없다는 단점이 있다.

위의 방안은 모두 안정적으로 메시지 발행을 보장할 수 없기 때문에 다른 대안이 필요하다.

메시지 발행 보장하기

Transactional outbox는 위의 문제를 모두 해결할 수 있다. Outbox 패턴을 사용하는 절차는 다음과 같다.

(1) 발행하고 싶은 이벤트 메시지를 outbox table에 기록한다. 비즈니스 로직을 실행하는 트랜잭션 안에서 데이터 저장이 발생한다. 때문에 이벤트 메시지 저장 작업에 문제가 발생하면 트랜잭션은 롤백된다.
(2) relay 배치에서 outbox table에 기록된 이벤트를 발행한다.
(3) 성공적으로 이벤트를 발행하고 나면 이벤트 발행 완료 마킹을 한다.

https://microservices.io/patterns/data/transactional-outbox.html

[Microservices Pattern: Transactional outbox

First, write the message/event to a database OUTBOX table as part of the transaction that updates business objects, and then publish it to a message broker.

microservices.io](http://microservices.io/patterns/data/transactional-outbox.html)

https://techblog.woowahan.com/7835/

[회원시스템 이벤트기반 아키텍처 구축하기 | 우아한형제들 기술블로그

{{item.name}} 최초의 배달의민족은 하나의 프로젝트로 만들어졌습니다. 배달의민족의 주문수는 J 커브를 그리는 빠른 속도로 성장했고, 주문수가 커지면서 자연스럽게 트래픽 또한 매우 커졌습니

techblog.woowahan.com](https://techblog.woowahan.com/7835/)