Transactional Outbox Pattern
분산시스템에서 트랜잭션의 원자성을 보장하기 위해, 분산 트랜잭션(2PC 등)을 활용할 수 있다.
트랜잭션 아웃박스 패턴은 트랜잭션과 이벤트 발행이 원자적으로 처리되어 데이터의 일관성을 보장하기 위해 등장했다.
트랜잭션 내에서 발생한 이벤트를 데이터베이스에 미리 저장해두고, 트랜잭션이 성공적으로 완료된 후에 비동기적으로 메시지로 전송하는 패턴이다.
주요 포인트
- 데이터베이스 트랜잭션이 커밋되면 메세지를 보내야 한다. 롤백되면, 메세지를 보내선 안된다.
- 메세지는 서비스에서 보낸 순서대로 메세지 브로커에 보내야 한다.
- 메세지의 순서는 여러 인스턴스에서 유지되어야 한다.
outbox란, ‘보낼 편지함’이다. 미전송 또는 전송 실패 메세지를 모아두는 것이다.
트랜잭셔널 아웃박스 패턴의 구현
- 트랜잭션 내 이벤트 저장: 트랜잭션이 성공적으로 완료되기 전에 발생한 이벤트를 임시 테이블이나 별도의 엔티티에 저장합니다.
- 트랜잭션 커밋: 트랜잭션이 성공적으로 커밋되면 저장된 이벤트를 메시지로 변환합니다.
- 메시지 전송: 변환된 메시지를 메시지 큐에 전송합니다.
구성
- Sender : 메시지를 보내는 서비스
- Database : 비즈니스 엔터티와 메시지 outbox를 저장하는 데이터베이스
- Message outbox : 관계형 데이터베이스인 경우, 이것은 보낼 메시지를 저장하는 테이블
- Message relay : 발신함에 저장된 메시지를 메시지 브로커로 전송
Message Relay
outbox 테이블은 임시 메시지 큐 역할을 하며 엔티티 업데이트와 함께 트랜잭션으로 묶인다.
Message Relay는 outbox 테이블에 저장하는 데이터를 비동기적으로 읽어서 메시지를 발행하여 메시지 브로커에게 전달하는 역할을 하게 된다.
Message Relay을 구현 방식 2가지
- Polling publisher
- Transaction log tailing
Polling publisher Pattern
테이블을 폴링해서 미발행된 메시지를 조회하는 것.
메세지 릴레이는 조회한 메세지를 하나씩 각자의 목적지 채널로 보내서 메세지 브로커에 발행한다. 그리고 나중에 outbox 테이블에서 메세지를 삭제한다.