피드로 돌아가기
Dev.toBackend
원문 읽기
Go Inbox 패턴으로 Kafka 중복 메시지, DB 트랜잭션 하나로 원천 차단
Kafka Inbox/Outbox in Go — Guaranteeing Exactly-Once Delivery in a Multi-Tenant ERP
AI 요약
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 테이블 + 트랜잭션 방식으로 중복 처리 원천 차단