Skip to content

[feat][queue-service] program 도메인 이벤트 처리 (Kafka Consumer) #27

Description

@rlaxxwls13

📌 개요

program-service 의 도메인 이벤트를 queue-service 가 Kafka 로 수신해 처리한다.

program 의 생명주기 (생성 / 시각 변경 / 취소) 에 따라 queue-service 의 대기열 상태가 일관되게 유지되어야 한다. 직접 호출 (REST) 대신 Kafka 이벤트로 느슨한 결합을 유지한다.

🎯 완료 기준

  • Kafka 이벤트 3 종의 Consumer 가 구현되어 있다.
    • program.created
    • program.time.updated
    • program.cancelled
  • 각 이벤트 처리 시 queue-service 의 도메인 액션이 정상 동작한다.
  • 같은 이벤트의 중복 수신 시 idempotency 보장 (Kafka offset 기반).
  • mock 이벤트 발행으로 통합 테스트 통과.

🧩 작업 범위

  • Kafka 의존성 추가 (spring-kafka)
  • application.yml 의 Kafka Consumer 설정
  • 이벤트 도메인 모델 작성
    • ProgramCreatedEvent
    • ProgramTimeUpdatedEvent
    • ProgramCancelledEvent
  • Infrastructure 레이어 (Kafka Listener)
  • Application 레이어 (ProgramEventService)
  • 도메인 액션 구현
    • program.created: 메타 정보 기록 (큐 활성화 X)
    • program.time.updated: 메타 정보 갱신
    • program.cancelled: 활성 토큰 모두 정리 + admit 중단
  • Idempotency 보장 (Kafka offset 기반)
  • 통합 테스트

🏗️ 설계 요약

통신 흐름

program-service → Kafka (program.* topics)
↓
Kafka Listener (Infrastructure)
↓
ProgramEventService (Application)
↓
도메인 액션 (Domain)

이벤트 페이로드

// program.created
{ "programId": "uuid", "openAt": "...", "closeAt": "...", "status": "DRAFT" }

// program.time.updated
{ "programId": "uuid", "openAt": "...", "closeAt": "..." }

// program.cancelled
{ "programId": "uuid", "status": "CANCELLED" }

도메인 액션

이벤트 queue-service 액션
program.created program 의 메타 정보 (openAt, closeAt, status) Redis 에 기록
program.time.updated 메타 정보 갱신
program.cancelled program 의 활성 토큰 모두 정리 (Sorted Set / Hash / 역인덱스) + admit 중단

Idempotency

Kafka 의 Consumer offset 기반 (Spring Kafka 표준 처리). 별도 eventId 검출 X (MVP).

미래 운영 단계: 페이로드에 eventId 추가 + Redis 의 처리 이력 저장.

Redis 키 추가

queue:program:{programId}:meta = JSON ({ openAt, closeAt, status })

기존 키:

  • queue:program:{programId} (Sorted Set, 대기열)
  • queue:token:{tokenId} (Hash, 토큰 데이터)
  • queue:user:{userId}:program:{programId} (String, 역인덱스)

🔗 참고 자료

  • 참고 자료 혹은 이미지 삽입 등이 필요한 경우, 이곳에 작성해주세요.

Metadata

Metadata

Assignees

Labels

No fields configured for Feature.

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions