백엔드
Transactional Outbox 패턴으로 메시지 발행 보장하기
두줄요약
Transactional Outbox 패턴으로 DB 트랜잭션과 메시지 발행의 원자성을 보완하는 방법을 소개했습니다. 리디는 Polling Publisher와 락 조합, 지연 삭제로 Kafka 메시지 신뢰성과 운영 성능을 함께 개선했습니다.
핵심 내용
- Event Driven Architecture에서 DB 트랜잭션과 메시지 발행의 원자성을 보장하기 위한 Transactional Outbox 패턴 소개
- 리디는 Kafka 도입 이후의 dead letter retry 방식 한계를 줄이기 위해 Polling Publisher 기반 Message Relay를 선택
- message, processed_message 테이블과 Redis lock, MySQL record lock을 조합해 중복 발행과 lock 경합을 완화
- 처리 완료 메시지를 즉시 삭제하지 않고 지연 삭제해 삭제 latency를 개선하고 운영 부하를 낮춤
구조와 흐름
- 비즈니스 트랜잭션에서 message 테이블에 발행 대상 저장
- Relay가 LEFT JOIN과 polling으로 미처리 메시지 조회 후 Kafka batch publish
- 성공·스킵 메시지는 processed_message에 기록하고 이후 오래된 row만 선별 삭제
선택 이유
- Polling Publisher는 구조가 단순해 빠르게 구현 가능
- Transaction Log Tailing은 binlog CDC, 메시지 스키마 관리 비용이 큼
- 우선 Polling 방식으로 시작하고 DB 부하를 모니터링하며 판단하는 전략
성능/운영 포인트
- 복수 node 운영을 위해 Redis lock과 MySQL lock을 함께 사용
- processed_message row 수를 일정 수준으로 유지해 조회 성능 확보
- SIGTERM, SIGINT 처리 시 현재 작업 종료까지 대기해 안정적 종료 보장
