피드로 돌아가기
컬리 기술블로그Backend
원문 읽기
Kafka Streams 윈도우 도입기
컬리가 재고 정산 처리를 배치 기반에서 Kafka Streams 텀블링 윈도우 기반 이벤트 처리로 전환해 준실시간 정산과 스파이크 트래픽 안정화 달성
AI 요약
Context
기존 배치 기반 정산 처리는 데이터 누적 대기로 실시간성이 낮고, 특정 시간대의 스파이크 트래픽이 시스템에 순간적 부하를 발생시켰다. 컬리의 주문 마감 및 새벽 도착 보장 비즈니스 특성상 시간대별 트래픽 편차가 크기 때문에 효율적인 데이터 집계 메커니즘이 필요했다.
Technical Solution
- 배치 기반 정산 → Kafka 기반 이벤트 처리: 데이터 생성 시간 기준 5분 단위로 수집 후 Kafka Topic으로 발행하는 구조로 변경
- Kafka Streams 텀블링 윈도우 도입: 5분 단위 고정 시간 간격으로 겹치지 않게 상품 코드별 데이터 집계 (윈도우 시간 10분, 유예 시간 5분 적용)
- TimestampExtractor를 통한 이벤트 시간 재정의: Kafka 발행 시간 대신 데이터 생성 시간을 윈도우 할당 기준으로 설정해 날짜 정합성 문제 해결
- suppress() 필터링: 윈도우 종료 전 중간 집계 결과는 발행하지 않고 윈도우 종료 후 최종 결과만 단 한 번 발행
- Processor API와 정기적 더미 이벤트 발행: 스트림 시간이 경과되지 않아 윈도우가 닫히지 않는 문제 해결을 위해 3분 단위로 외부에서 더미 이벤트 발행해 스트림 시간을 강제로 진전
Key Takeaway
Kafka Streams 윈도우 기반 설계는 단순히 고정 시간 구간으로 데이터를 자르는 것이 아니라, 이벤트 시간(event time)과 스트림 시간(stream time)의 관계를 정확히 정의하고 경계 시점(자정 등) 데이터 처리 정책을 명확히 수립해야 한다.
실천 포인트
시계열 데이터를 시간 단위로 집계해야 하는 금융·정산 시스템에서 Kafka Streams의 TimestampExtractor와 유예 시간(grace period)을 조합하면 발행 시간과 생성 시간의 불일치로 인한 윈도우 할당 오류를 방지할 수 있다. 또한 windowedBy() + suppress(untilWindowCloses()) 패턴으로 중간 집계를 제거하고 최종 결과만 발행하면 데이터 중복 처리를 차단할 수 있다.