목록 보기
Transactional Outbox 패턴으로 메시지 발행 보장하기
백엔드

Transactional Outbox 패턴으로 메시지 발행 보장하기

RIDI
RIDI
2024년 1월 17일

두줄요약

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 처리 시 현재 작업 종료까지 대기해 안정적 종료 보장

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...