Transactional Outbox Pattern

데이터베이스 트랜잭션과 메시지 발행의 원자성을 보장하는 분산 시스템 패턴


핵심 개념

트랜잭셔널 아웃박스 패턴은 데이터베이스에 비즈니스 데이터를 쓰는 것과 메시지 브로커에 이벤트를 발행하는 것을 하나의 트랜잭션으로 묶는 패턴이다. DB 트랜잭션 내에서 아웃박스 테이블에 이벤트를 기록하고, 별도 프로세스가 아웃박스를 폴링하여 브로커에 전달한다.

Zapier의 프로덕션 사례

아키텍처

  • Go 기반 Events API에서 구현
  • 샤딩된 SQLite on EBS: Kubernetes StatefulSet에서 EBS 볼륨 위 SQLite 사용
  • WAL 모드: 동시 읽기/쓰기 허용
  • 50 샤드/파드 + 샤드별 뮤텍스: 동시성 제어
  • Kafka 장애 시 15,000 events/sec 처리 가능

운영 한계

  • 정적 샤딩의 핫스팟 문제
  • StatefulSet의 운영 제약 (스케일링, 배포 복잡도)

차세대 설계: 사이드카 패턴

  • 장애 시 S3에 쓰고, SQS를 통해 리플레이
  • StatefulSet 의존성 제거
  • 더 유연한 스케일링

패턴 비교

접근법내구성복잡도지연
직접 발행 (fire-and-forget)낮음낮음낮음
아웃박스 + 폴링높음중간중간
아웃박스 + CDC높음높음낮음
사이드카 + S3/SQS높음중간중간~높음

연관 개념


Source: Lessons from Using the Outbox Pattern at Scale