Skip to content

[Step4]: Kafka 기반 Event-Driven 아키텍처를 도입하고 Non-blocking 처리를 구현한다 #11

@woong2e

Description

@woong2e

✅ PR

#12

📝 Description

배경

  • 현재 Redis Lua Script를 통해 동시성 제어에는 성공했으나, 요청 처리 과정에서 DB Insert(I/O)가 동기적으로 수행되어 트래픽 급증 시 응답 지연 및 DB 커넥션 고갈 현상이 나타남
  • 시스템 장애 시 요청 유실 가능성이 존재

목표

  • 비동기 처리: 쿠폰 발급 요청을 Kafka 토픽으로 발행(Publish)하고 즉시 응답하여 Throughput을 극대화
  • 부하 분산: DB 쓰기 작업을 Consumer가 처리하게 하여, 트래픽 피크 시에도 DB가 다운되지 않도록 보호 (Backpressure 역할)
  • 데이터 정합성: 최소 한 번 전송 특성을 가진 Kafka 환경에서 멱등성 패턴을 도입하여 중복 발급을 원천 차단

구현 시나리오

  • Producer: Redis 재고 감소 성공 시, Event를 Kafka로 전송
  • Consumer: Kafka에서 메시지를 읽어 실제 DB에 쿠폰 정보를 저장
  • Idempotency: Consumer가 메시지를 처리하기 전, 이미 처리된 메시지인지 확인

📝 Todo

1. 인프라 설정

  • Apache Kafka 및 KRaft Docker Compose 환경 구성
  • Kafka Topic 생성 (예: coupon-issue-topic) 및 Partition 수 설정 (확장성 고려)

2. Producer 구현 (Web Layer)

  • 기존 CouponService 로직 분리: DB 직접 저장 로직 제거
  • Redis Lua Script 성공 시 Kafka Message 발행 로직 구현 (KafkaTemplate 활용)
  • Kafka 발행 실패 시 예외 처리 (Fallback)

3. Consumer 구현 (Worker Layer)

  • @KafkaListener를 사용한 Consumer 구현
  • Event 객체를 받아 DB에 Coupon 저장

4. 멱등성 보장

  • 메시지 중복 수신 시 방어 로직 구현

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions