분산 환경에서의 트랜잭션 처리 - Transactional Outbox pattern

분산환경에서의 데이터 전달 방식에 대해

Posted by Yan on September 29, 2024

Transactional Outbox Pattern

분산시스템에서 트랜잭션의 원자성을 보장하기 위해, 분산 트랜잭션(2PC 등)을 활용할 수 있다.
트랜잭션 아웃박스 패턴은 트랜잭션과 이벤트 발행이 원자적으로 처리되어 데이터의 일관성을 보장하기 위해 등장했다.

트랜잭션 내에서 발생한 이벤트를 데이터베이스에 미리 저장해두고, 트랜잭션이 성공적으로 완료된 후에 비동기적으로 메시지로 전송하는 패턴이다.

주요 포인트

  • 데이터베이스 트랜잭션이 커밋되면 메세지를 보내야 한다. 롤백되면, 메세지를 보내선 안된다.
  • 메세지는 서비스에서 보낸 순서대로 메세지 브로커에 보내야 한다.
  • 메세지의 순서는 여러 인스턴스에서 유지되어야 한다.

outbox란, ‘보낼 편지함’이다. 미전송 또는 전송 실패 메세지를 모아두는 것이다.

트랜잭셔널 아웃박스 패턴의 구현

  • 트랜잭션 내 이벤트 저장: 트랜잭션이 성공적으로 완료되기 전에 발생한 이벤트를 임시 테이블이나 별도의 엔티티에 저장합니다.
  • 트랜잭션 커밋: 트랜잭션이 성공적으로 커밋되면 저장된 이벤트를 메시지로 변환합니다.
  • 메시지 전송: 변환된 메시지를 메시지 큐에 전송합니다.

구성

transactionaloutbox

  • Sender : 메시지를 보내는 서비스
  • Database : 비즈니스 엔터티와 메시지 outbox를 저장하는 데이터베이스
  • Message outbox : 관계형 데이터베이스인 경우, 이것은 보낼 메시지를 저장하는 테이블
  • Message relay : 발신함에 저장된 메시지를 메시지 브로커로 전송

Message Relay

outbox 테이블은 임시 메시지 큐 역할을 하며 엔티티 업데이트와 함께 트랜잭션으로 묶인다.
Message Relay는 outbox 테이블에 저장하는 데이터를 비동기적으로 읽어서 메시지를 발행하여 메시지 브로커에게 전달하는 역할을 하게 된다.

Message Relay을 구현 방식 2가지

  1. Polling publisher
  2. Transaction log tailing

Polling publisher Pattern

테이블을 폴링해서 미발행된 메시지를 조회하는 것.

메세지 릴레이는 조회한 메세지를 하나씩 각자의 목적지 채널로 보내서 메세지 브로커에 발행한다. 그리고 나중에 outbox 테이블에서 메세지를 삭제한다.


reference

트랜잭셔널 아웃박스 패턴의 실제 구현 사례 (29CM)