본문으로 이동
컬리의 입고 시스템이 외부 인입 데이터를 안전하게 동기화하는 방법
문서

컬리의 입고 시스템이 외부 인입 데이터를 안전하게 동기화하는 방법

이창섭 · 컬리 · 컬리 기술 블로그

원본 보기

소개

아웃박스 패턴과 재시도 토픽으로 외부 채널 입고 정보를 안전하게 동기화하기

AI 핵심 요약

3PL 사업 확장으로 외부 채널의 입고 예정 정보가 늘면서, DB 저장과 Kafka 발행의 불일치 및 기반 정보 지연으로 인한 컨슈머 실패를 운영자 개입 없이 복구할 방법이 필요해졌다. 발행부에는 Spring Boot용 Namastack Outbox를 적용해 인터페이스 데이터와 이벤트를 같은 트랜잭션으로 저장하고, 폴러가 Kafka 발행과 재시도를 맡도록 구성했다. 수신부에는 Spring Kafka의 RetryableTopic을 도입해 실패 메시지를 10분 간격으로 최대 24시간 재시도하고, 소진된 메시지는 DLT로 보내도록 설계했다. 다만 아웃박스 발행과 완료 표시 사이의 장애로 중복 메시지가 생길 수 있어 컨슈머 멱등성이 필요하며, 재시도 토픽 수와 직렬화 방식도 함께 고려해야 한다.

  • DB 트랜잭션 안에서 Kafka를 직접 발행하면 DB 커밋 실패 시 데이터와 메시지가 어긋날 수 있으므로, 발행할 이벤트를 같은 트랜잭션의 아웃박스 테이블에 저장하세요.
  • 아웃박스는 발행 성공 후 완료 표시 전에 장애가 나면 중복 발행될 수 있으므로, 컨슈머에 멱등성 처리를 마련해야 합니다.
  • 재시도 토픽을 하나만 재사용하면 재시도 횟수가 많을 때 토픽이 과도하게 늘어나는 것을 막을 수 있습니다.
  • 이미 직렬화된 Kafka 메시지를 재시도 토픽으로 보낼 때는 이중 직렬화를 피하도록 별도의 String 직렬화 템플릿을 구성하세요.