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 | 높음 | 중간 | 중간~높음 |
연관 개념
- Change Data Capture
- Real-Time Stream Processing
- Distributed Systems Reliability
- Silent Failures and Data Integrity