Skip to content

Inventory Event Log 및 Projection Consumer 구현 #97

@koosco

Description

@koosco

배경

Flash Sale 재고는 Redis에서 먼저 처리되므로, 영속 저장소와 운영 조회를 위해 별도의 event log와 projection이 필요하다.
이벤트는 at-least-once 전송을 전제로 하고, 컨슈머에서 멱등하게 처리해야 한다.


구현 내용

1. 이벤트 스키마 정의

필수 필드:

  • eventId
  • eventType (RESERVED, CONFIRMED, RELEASED, EXPIRED)
  • skuId
  • orderId (nullable)
  • reservationId
  • qty
  • version
  • occurredAt

2. event log 테이블 구현

예시:

  • inventory_event_log
    • event_id unique
    • sku_id
    • reservation_id
    • order_id
    • event_type
    • qty
    • version
    • occurred_at

3. projection 테이블 구현

예시:

  • inventory_projection
    • sku_id
    • available
    • reserved
    • sold
    • last_version

4. Consumer 구현

  • Stream/Kafka에서 이벤트 consume
  • DB transaction 내에서:
    1. event log insert 시도
    2. 이미 존재하면 중복 이벤트로 간주
    3. 없으면 projection 갱신
  • DB commit 후 ack

5. 순서 보장/버전 검증

  • version이 뒤집힌 이벤트 감지
  • last_version보다 낮은 이벤트는 무시 또는 별도 보관
  • 순서 꼬임 케이스 로깅

체크리스트

  • 이벤트 스키마 정의
  • inventory_event_log 테이블 생성
  • inventory_projection 테이블 생성
  • consumer 구현
  • eventId 멱등 처리 구현
  • version 검증 로직 구현
  • commit 후 ack 처리 구현
  • 중복 이벤트 테스트 작성
  • 순서 역전 테스트 작성

의존관계

선행

  • Flash Sale reservation 구현
  • Flash Sale confirmation/release 구현

후행

  • reconciliation / rebuild / 운영 대응 구현

작업 순서

  1. 이벤트 스키마 확정
  2. event log / projection 테이블 생성
  3. consumer 구현
  4. 멱등/버전 처리 추가
  5. 테스트 작성

완료 조건

  • Redis 처리 결과가 RDB event log 및 projection에 반영된다.
  • 중복 소비에도 projection이 깨지지 않는다.
  • version 기반으로 순서 문제를 감지할 수 있다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions