
Kafka Streams는 실시간 데이터 처리를 위해 강력한 스트림 처리 기능을 제공한다. 다양한 윈도우링 옵션을 통해 데이터 처리의 유연성도 높일 수 있어. Kafka Streams에서 제공하는 주요 윈도우 종류와 그 특징, 그리고 사용 예시를 알아보자.

Tumbling Window는 고정된 크기의 시간 간격으로 데이터를 나누는 가장 기본적인 윈도우 타입이다. 각 윈도우는 연속적이고, 서로 겹치지 않아서 이벤트는 하나의 윈도우에만 속하게 된다.
TimeWindows.ofSizeAndGrace(Duration.ofMinutes(5), Duration.ofMinutes(1))
이 코드에서는 5분 간격으로 윈도우를 설정하고, 1분의 그레이스 기간을 둬서 늦게 도착한 데이터를 처리할 수 있게 해준다.

Hopping Window는 일정한 간격으로 슬라이딩하면서 데이터를 그룹화하는 윈도우 타입이다. 각 윈도우는 일정한 시간 간격으로 시작되고, 윈도우 간에 중첩이 있을 수 있다. 그래서 하나의 이벤트가 여러 윈도우에 포함될 수 있다.
TimeWindows.ofSizeAndGrace(Duration.ofMinutes(5), Duration.ofMinutes(1))
.advanceBy(Duration.ofMinutes(1))
이 코드는 5분 간격의 윈도우를 1분마다 슬라이딩하면서 데이터를 그룹화한다. 즉, 매 1분마다 새로운 윈도우가 생성되고, 이전 윈도우와 겹칠 수 있다.

Sliding Window는 두 이벤트 간의 시간 차이를 기반으로 동적으로 윈도우를 생성하는 타입이다. 윈도우는 이벤트가 발생할 때마다 이동하며, 중첩될 수 있다. 이 윈도우는 이벤트 간의 상관관계를 분석할 때 유용하다.
SlidingWindows.ofTimeDifferenceAndGrace(Duration.ofMinutes(5), Duration.ofMinutes(1))
이 설정은 두 이벤트 간의 최대 시간 차이가 5분일 때 동일한 윈도우에 포함시키고, 그레이스 기간으로 1분을 허용한다.

체크 표시가 되어있는 윈도우를 보면 새로운 이벤트를 포함하는 것도 아닌데 생겼다. 이런 윈도우를 편하게 후속 윈도우라고 불러보겠다.
기본 개념: n, n-1, …, 1의 규칙
- n: 가장 최근에 도착한 레코드가 포함된 슬라이딩 윈도우
- n-1: 직전 시점에 생성된 윈도우, 해당 시점의 레코드를 포함
- n-2, …, 1: 이전 시점에 생성된 윈도우들이며, 이전 레코드를 포함
첫 번째 그래프: A 레코드 도착

두 번째 그래프: B 레코드 도착

세 번째 그래프: C 레코드 도착

네 번째 그래프: D 레코드 도착

슬라이딩 윈도우는 짧은 시간 간격으로 이벤트를 처리하기 때문에, 실시간으로 발생하는 중요한 이벤트(예: 트랜잭션 실패, 사용자 로그인 시도 등)에 대한 빠른 알림과 대응이 가능하다. 이로 인해 실시간 트리거 시스템이 효과적으로 운영될 수 있다. 특정 시간 내에 발생한 모든 이벤트의 합계나 평균을 구하는 경우, 여러 윈도우에 포함된 데이터를 통해 보다 정확한 결과를 얻을 수 있다.

Session Window는 활동 간의 간격을 기준으로 윈도우를 정의한다. 데이터가 일정 기간 동안 발생하지 않으면 세션이 종료되고, 새로운 데이터가 도착하면 새로운 세션이 시작된다. 세션 윈도우는 사용자 활동을 추적하거나 이벤트 간의 연속성을 분석하는 데 유용하다.
SessionWindows.withGapAndGrace(Duration.ofMinutes(5), Duration.ofMinutes(1))
이 코드에서는 5분의 비활동 기간 이후 세션을 종료하고, 그레이스 기간으로 1분을 설정해서 세션 종료 후 도착하는 데이터를 처리할 수 있게 해준다.
Kafka Streams는 다양한 윈도우링 옵션을 통해 실시간 스트림 데이터를 유연하게 처리할 수 있다. 각 윈도우 타입은 특정한 데이터 처리 요구에 맞게 설계되었고, 이러한 윈도우링 옵션을 잘 활용하면 복잡한 데이터 분석 및 처리 작업을 보다 쉽게 할 수 있다. 이 글에서 소개한 윈도우 타입들을 이해하고, 필요에 따라 적절한 윈도우를 선택해서 사용해보자.