← Apache Flink 코스

Courses · Day 3

핵심개념 B — 늦게 오는 데이터와 오래 유지되는 상태

스텝 8 / 17

8 / 17
개념 flink-course-08

Windowing — Tumbling/Sliding/Session

직관적으로

끝없이 흐르는 강물(스트림)에서 물고기를 세려면 어떤 식으로든 '구간'을 나눠야 한다. 겹치지 않게 5분씩 뚝뚝 끊어서 세는 방법(Tumbling), 5분 구간을 1분마다 겹치게 계속 옮겨가며 세는 방법(Sliding), 물고기가 안 지나가는 공백이 생기면 그때 구간을 끊는 방법(Session) — 이 세 가지가 Flink의 대표 윈도우 타입이다.

실제 사례

"5분마다 매출 합계를 낸다"는 Tumbling Window(겹치지 않는 고정 구간)의 전형적 사례다. "최근 5분간의 이동평균을 1분마다 갱신해서 보여준다"는 Sliding Window(구간이 겹침)의 전형적 사례다. "사용자가 앱을 켜고 조작하다가 10분 이상 조작이 없으면 그 세션을 종료로 본다"는 Session Window(비활성 구간 기준 동적 경계)의 전형적 사례다.

정확한 원리

Tumbling Window는 고정된 크기의 윈도우가 서로 겹치지 않고 연속으로 이어진다(한 이벤트는 정확히 하나의 윈도우에만 속함). Sliding Window는 윈도우 크기와 슬라이드 간격을 따로 지정해, 슬라이드 간격이 윈도우 크기보다 작으면 한 이벤트가 여러 윈도우에 동시에 속하게 된다. Session Window는 고정 크기가 없고, 이벤트 사이의 간격(gap)이 지정한 시간을 넘으면 그 지점에서 세션이 끊긴다 — 그래서 윈도우 경계가 데이터 자체에 의해 동적으로 결정된다. 세 타입 모두 앞서 배운 watermark가 "이 윈도우 구간이 이제 완전히 끝났다"를 판단하는 기준으로 쓰인다는 공통점이 있다.

흔한 오해

"Sliding Window는 그냥 Tumbling Window를 여러 번 겹쳐서 만드는 거니까 계산 비용이 그만큼 배로 든다"고 단순히 생각하기 쉬운데, 실제로는 Flink가 겹치는 구간의 중복 계산을 최적화해서 처리하는 내부 구현이 있다 — 다만 이 코스에서는 이 최적화 세부사항보다 '언제 어떤 윈도우 타입을 골라야 하는가'라는 실무 판단력에 집중한다.

확인 문제

"쇼핑몰에서 사용자가 상품을 둘러보다가 30분 이상 아무 활동이 없으면 그 방문 세션을 끝난 것으로 보고, 세션 하나당 조회한 상품 수를 집계하고 싶다"는 요구사항이라면 Tumbling/Sliding/Session 중 어느 윈도우가 적합할까? 왜 그런가?