피드로 돌아가기
Kafka Inbox/Outbox in Go — Guaranteeing Exactly-Once Delivery in a Multi-Tenant ERP
Dev.toDev.to
Backend

Go Inbox 패턴으로 Kafka 중복 메시지, DB 트랜잭션 하나로 원천 차단

Kafka Inbox/Outbox in Go — Guaranteeing Exactly-Once Delivery in a Multi-Tenant ERP

Md Zonieed Hossain2026년 4월 1일5intermediate

Context

멀티 테넌트 ERP에서 네트워크 재시도나 더블 클릭으로 중복 메시지가 발생한다. 재고가 이중 차감되고 주문이 중복 생성되는 문제가 실제 서비스에서 빈번하게 발생한다. Kafka transactions는 프로듀서-브로커 간만 보장하므로 컨슈머측 비즈니스 로직의 중복 실행은 해결하지 못한다.

Technical Solution

  • [inbox 테이블] → [message_id를 PRIMARY KEY로 저장]하여 중복 감지
  • [InsertFirstAttempt 메서드] → [ON CONFLICT DO NOTHING으로 원자적 삽입 시도]
  • [HandleStockUpdate 컨슈머] → [inbox insert + 재고 차감 + 커밋을 단일 트랜잭션으로 통합]
  • [이미 처리된 메시지] → [RowsAffected 0 반환 시 early return으로 중복 건너뛰기]
  • [CleanInbox 워커] → [7일 이전 레코드 자동 삭제로 테이블 성장 방지]

Impact

네트워크 재시도 중복 재고 차감 — 완전 제거 더블 클릭으로 인한 주문 중복 — 완전 제거

Key Takeaway

정합성 문제는 복잡한 인프라 없이 데이터베이스 트랜잭션과 고유 식별자로 해결할 수 있다. Exactly-Once Delivery는 Kafka 레벨이 아닌 애플리케이션 레벨에서 보장해야 한다.


Kafka 컨슈머가 DB 쓰기를 수행하는 환경에서 inbox 테이블 + 트랜잭션 방식으로 중복 처리 원천 차단

원문 읽기