📄 이슈 내용 (기능 요약)
Order 서비스가 비동기(Outbox) 아키텍처로 전환됨에 따라, 기존의 동기 API(/internal/stocks/restore) 통신을 대체할 Kafka Consumer 및 멱등성(Idempotency) 제어 로직을 구현
📝 상세 내용 및 요구사항
- 이전의 Feign 연동이 해제되고, 대신 카프카의
stock.restored 이벤트를 구독하여 재고를 복구
- 카프카의 At-Least-Once 전달 보장 특성과 Consumer 리밸런싱,
auto-offset-reset: earliest 설정에 따른 오프셋 초기화 등으로 인해 동일한 메시지가 중복 수신될 수 있는 리스크가 존재함.
- 수신 시
ProcessedEvent 테이블에 reservationId (또는 Outbox ID)를 INSERT 시도하여 중복을 방지함.
- UNIQUE 제약조건 위반 시: 이미 처리된 중복 메시지로 판단하여 비즈니스 로직 생략 (return)
- 성공 시에만: 순수 비즈니스 로직(재고 복구)을 호출하여 이중 재고 복구를 완벽히 방지
✅ 체크리스트 (구현할 내용)
📍 레퍼런스
- DB UniqueConstraint 기반 멱등성(Idempotency) 제어 전략
- Kafka Consumer Rebalancing 및 At-Least-Once Delivery 방어 기법
feat/26-kafka-consumer-idempotency
📄 이슈 내용 (기능 요약)
Order 서비스가 비동기(Outbox) 아키텍처로 전환됨에 따라, 기존의 동기 API(
/internal/stocks/restore) 통신을 대체할 Kafka Consumer 및 멱등성(Idempotency) 제어 로직을 구현📝 상세 내용 및 요구사항
stock.restored이벤트를 구독하여 재고를 복구auto-offset-reset: earliest설정에 따른 오프셋 초기화 등으로 인해 동일한 메시지가 중복 수신될 수 있는 리스크가 존재함.ProcessedEvent테이블에reservationId(또는 Outbox ID)를 INSERT 시도하여 중복을 방지함.✅ 체크리스트 (구현할 내용)
ProcessedEvent엔티티 생성 (멱등키 컬럼에 UNIQUE 제약조건 추가)OrderEventConsumer에서 페이로드 내 멱등키 파싱 로직 추가 (필요 시 DTO 확장)StockCommandService.restoreStock()호출하도록 연결InternalStockController의 restore API deprecate 처리 또는 제거📍 레퍼런스
feat/26-kafka-consumer-idempotency