윈도우 Grace Period — 창을 닫기 전에 얼마나 더 기다려줄 것인가
Kafka Streams Grace Period 및 MirrorMaker 2 Offset Translation 공식 문서·기술 블로그 종합 (웹 리서치, 2026) — Apache Kafka 공식 Javadoc(TimeWindows), KIP-382(MirrorMaker 2.0), Kafka 공식문서 MirrorMaker Apache Kafka 공식 Javadoc TimeWindows
이 모듈을 다 읽으면
- grace period가 윈도우 크기와 별개로 '창이 실제로 닫히는 시점'을 얼마나 늦추는지 설명할 수 있다
- grace period가 지나면 늦은 레코드가 버려진다는 것과, 이것이 kafka-learn-57의 suppress()와 어떻게 이어지는지 설명할 수 있다
kafka-learn-37에서 다룬 Kafka Streams의 4가지 윈도우 연산을 전제로, 그 윈도우가 실제로 언제 '닫히는지'를 결정하는 grace period와, kafka-learn-57에서 다룬 suppress()가 이 grace period와 어떻게 맞물리는지를 정리한다.
윈도우 크기와 별개의 축 — 얼마나 늦게 와도 봐줄 것인가
TimeWindows.ofSizeAndGrace(윈도우 크기, grace period)로 두 값을 따로 지정한다 — 윈도우 크기가 '한 창에 얼마의 시간 범위를 담을지'를 정한다면, grace period는 '그 창의 끝 시각을 지나고도 얼마나 더 늦게 도착한 레코드까지 받아줄지'를 정하는 별개의 축이다. 예를 들어 10분 윈도우에 grace period 2분을 주면, 실질적인 데이터 수용 시간은 12분이 된다 — 이 시간이 다 지나서야 들어오는 레코드는 버려진다.
핵심 포인트
- TimeWindows.ofSizeAndGrace(윈도우 크기, grace period) — 윈도우 크기와 grace period는 서로 독립적인 축
- 예: 10분 윈도우+2분 grace period = 실질 수용 시간 12분, 그 이후 도착 레코드는 버려짐
닫힘 판정 기준 — 이벤트 시간(watermark 상당)이지 벽시계 시간이 아니다
윈도우가 실제로 닫히는 시점은 (관측된 최대 이벤트 시간이 그 윈도우의 끝+grace period를 지났다고 판단되는 시점)이다 — Kafka Streams는 이 판정에 벽시계 시간(wall-clock time)이 아니라 이벤트 시간만 쓴다. 이는 spark-learn-44에서 다룬 Spark의 워터마크와 개념적으로 같은 목적(늦은 데이터를 얼마나 기다려줄지 정하고 그 이후 상태를 정리)을 갖지만, Spark가 '워터마크'라는 전역적인 이동 임계값 개념으로 표현하는 반면 Kafka Streams는 윈도우마다 개별적인 grace period로 표현한다는 구현상의 차이가 있다.
핵심 포인트
- 윈도우 닫힘 판정은 벽시계 시간이 아니라 이벤트 시간 기준(관측된 최대 이벤트 시간이 윈도우 끝+grace를 지났는가)
- Spark의 워터마크(spark-learn-44)와 목적은 같지만, Spark는 전역 이동 임계값으로 Kafka Streams는 윈도우마다 개별 grace period로 표현한다는 구현 차이
grace period가 끝난 뒤 — suppress()와의 관계
grace period가 다 지나 윈도우가 완전히 닫히고 나면, kafka-learn-57에서 다룬 suppress()가 그 시점에 최종 결과 하나를 내보낸다 — suppress()의 Suppressed.untilWindowCloses()는 사실상 이 grace period가 끝나는 순간을 트리거로 삼는 것이다. 즉 grace period는 '언제까지 늦은 데이터를 받아줄지'를 정하고, suppress()는 그 grace period가 끝나는 순간에 맞춰 '그동안 계속 나가던 중간 결과를 억누르고 최종 결과 하나만 내보내는' 역할을 한다 — 둘은 서로 다른 메커니즘이지만 같은 시점(윈도우 종료)을 공유한다.
핵심 포인트
- grace period 종료 = 윈도우가 완전히 닫히는 시점 = suppress()(kafka-learn-57)의 Suppressed.untilWindowCloses()가 최종 결과를 내보내는 트리거
- grace period(언제까지 늦은 데이터를 받을지)와 suppress()(그 시점에 최종 결과만 내보낼지)는 서로 다른 메커니즘이지만 같은 시점을 공유