무한한 스트림을 유한한 구간으로 잘라내는 것. 스트림이 끝나지 않으므로 전부 다 모아서 평균을 낸다는 말이 성립하지 않는다. 그래서 구간을 정한다.
이동 평균, 이번 주 가장 많이 팔린 상품, 시스템의 99분위 부하가 전부 윈도우 작업이다. 두 스트림을 조인하는 것도 윈도우 작업인데, 같은 시간 간격 안에 발생한 이벤트끼리 맞춰야 하기 때문이다.
크기, 진행 간격, 갱신 가능 기한
윈도우를 정의할 때 정해야 할 것이 셋이다.
윈도우 크기는 5분치인가 하루치인가를 정한다.
진행 간격은 윈도우가 얼마나 자주 움직이는가를 정한다. 이 값과 크기의 관계가 아래의 두 갈래를 만든다.
갱신 가능 기한은 이벤트가 해당 윈도우에 추가될 수 있는 마감이다. 이벤트가 최대 4시간까지 지연될 수 있다면 그때까지는 결과를 다시 계산해 갱신하고, 그 이상 지연된 것은 무시한다. 비순차 이벤트를 얼마나 받아줄 것인가의 문제이고, 오래 열어둘수록 로컬 상태의 메모리를 더 쓴다.
계산의 기준을 벽시계에 맞출지도 고를 수 있다. 정각에 맞춰 정렬할 수도 있고, 정렬하지 않고 애플리케이션이 실행된 시점을 기준으로 삼을 수도 있다. 리포트를 사람이 읽는다면 정각 정렬이 자연스럽고, 순수한 이동 평균이라면 정렬할 이유가 없다.
호핑, 텀블링, 세션
호핑 윈도우는 윈도우 크기와 윈도우 사이의 고정된 시간 간격이 따로 놀아서 윈도우들이 겹칠 수 있다. 5분 크기에 1분마다 진행하면 한 이벤트가 5개 윈도우에 들어간다.
텀블링 윈도우는 윈도우 크기가 곧 진행 간격이라 겹치지 않는다. 5분 크기에 5분마다 진행하면 각 이벤트가 정확히 하나의 윈도우에 속한다.
세션 윈도우는 크기를 시간이 아니라 비활동 기간으로 정한다. 개발자가 세션 간격을 정의하면 그보다 짧은 간격으로 연속해서 도착한 이벤트들이 하나의 세션에 묶이고, 세션 갭 이상 이벤트가 없으면 새 세션이 시작된다. 사용자의 한 번의 방문이나 한 번의 작업 흐름처럼 길이가 정해져 있지 않은 활동 단위를 다룰 때 필요하다.
참고
원본은 호핑 윈도우를 “윈도우의 크기 = 윈도우 사이의 고정된 시간 간격”, 텀블링 윈도우를 “윈도우의 크기 = 진행 간격”이라고 적어 둘을 같은 정의로 만들어버렸다. 카프카 스트림즈에서 호핑 윈도우는 크기와 진행 간격을 따로 정하는 윈도우이고, 진행 간격이 크기보다 작으면 윈도우가 겹쳐 하나의 레코드가 여러 윈도우에 들어간다. TimeWindows 자바독은 이것을 겹치는 윈도우로 잘라내는 것이라 적고 하나의 레코드가 인접한 여러 윈도우에 담길 수 있다고 명시하며, 텀블링 윈도우를 “진행 간격이 크기와 같은(advance == size) 호핑 윈도우의 특수한 경우”로 정의한다. N번째 윈도우의 구간은 [N * advance, N * advance + size)다. Kafka Streams, TimeWindows