
컬리의 입고 시스템이 외부 인입 데이터를 안전하게 동기화하는 방법
두줄요약
외부 입고 데이터 동기화에서 DB와 Kafka 간 원자성 문제를 아웃박스 패턴으로 보완했습니다.\nSpring Kafka 재시도 토픽으로 선행 정보 지연에 따른 실패를 자동 복구하도록 구성했습니다.
문제 상황
- 3PL 사업 확장으로 외부 채널의 다양한 입고 예정 정보 수신 및 동기화 필요
- DB 커밋 실패 후 Kafka 메시지만 발행되는 원자성 붕괴 위험
- 선행 파트너·상품 정보 지연으로 인한 컨슈머 처리 실패와 수동 재발행 부담
구조와 흐름
- 인터페이스 데이터와 발행 메시지를 동일 트랜잭션에서 아웃박스 테이블에 저장
- Namastack Outbox 폴러가 미처리 레코드를 Kafka로 발행하고 성공 상태·재시도 횟수 관리
- Spring Kafka
@RetryableTopic으로 실패 메시지를 10분 간격, 최대 24시간 재처리 후 DLT 이관
선택 이유
- 아웃박스 테이블 관리, 폴링, 백오프, 인스턴스 상태 관리의 라이브러리 위임
- 발행부 저장소에 수신부가 직접 의존하지 않는 책임 분리
- 단일 재시도 토픽 전략으로 다수 재시도 토픽 생성과 운영 복잡도 축소
주의할 점
- 발행 성공과 아웃박스 완료 마킹 사이 장애에 대비한 Kafka 컨슈머 멱등성 보장 필요
- 재시도 발행용 String 직렬화 KafkaTemplate 분리로 이중 직렬화 방지
- 메인·재시도·DLT 토픽별 실패 및 성공 알림 정책 구분


