Skip to content

[FEAT] 주문 취소 비동기 전환에 따른 Kafka Consumer 및 멱등성 보장 로직 구현 #26

Description

@ji-circle

📄 이슈 내용 (기능 요약)

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)
    • 성공 시에만: 순수 비즈니스 로직(재고 복구)을 호출하여 이중 재고 복구를 완벽히 방지

✅ 체크리스트 (구현할 내용)

  • ProcessedEvent 엔티티 생성 (멱등키 컬럼에 UNIQUE 제약조건 추가)
  • OrderEventConsumer에서 페이로드 내 멱등키 파싱 로직 추가 (필요 시 DTO 확장)
  • 멱등성 검증 로직 추가 및 성공 시에만 StockCommandService.restoreStock() 호출하도록 연결
  • 기존 InternalStockController의 restore API deprecate 처리 또는 제거

📍 레퍼런스

  • DB UniqueConstraint 기반 멱등성(Idempotency) 제어 전략
  • Kafka Consumer Rebalancing 및 At-Least-Once Delivery 방어 기법

feat/26-kafka-consumer-idempotency

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions