【问题标题】:Recreating Kinesis stagger window in Kafka在 Kafka 中重新创建 Kinesis 交错窗口
【发布时间】:2026-01-28 04:40:02
【问题描述】:

AWS Kinesis 提供了一种流窗口实施,有助于“分析在不一致时间到达的数据组”stagger windows

这样的窗口实现特别强大,因为它确保窗口仅在收到第一个事件(由事件分组定义)时启动,并在固定时间后完成,从而减少了一个接一个地很快收到的事件数量, 最终出现在不同的窗口中。

Kinesis 似乎是一个快速简单的流实现选择的绝佳选择,但为了审查未来潜在的“锁定”,我们正在尝试了解如何在需要时使用 Kafka 流重新创建类似的功能.

Kafka streams 似乎支持以下窗口函数:

根据我们现有的研究,会话窗口可能是最接近交错的选项。然而,我们注意到,即使在该会话被认为“过期/发出”之后,如果迟到的事件到达,会话窗口仍然可以“更新”,并且在未来的“流时间”事件之前可能不会发出会话有记录吗?

因此,我想问一下交错窗口的最接近的实现/是否可能在 Kafka 中,以及需要注意哪些潜在的“陷阱”。

【问题讨论】:

    标签: apache-kafka apache-kafka-streams amazon-kinesis


    【解决方案1】:

    会话窗口可能有些相似,但是会话窗口没有固定大小。窗口边界由“间隙”参数确定。以亚马逊文档为例,前两个事件(我们称它们为 A 和 B)相隔 10 秒,第二个和第三个 (C) 相隔 35 秒,第三个和第四个 (D) 相隔 10 秒。如果您指定 10 秒的间隔,您将获得 A、B 和 C、D 两个窗口,这两个窗口与翻转窗口不同,与交错窗口不同。如果您指定 35 秒的间隔,您将获得一个包含所有 4 个事件的窗口。

    根据您的用例,它可能仍然可以使用会话窗口工作。

    然而,我们注意到,如果延迟事件到达,即使该会话被视为“过期/发出”,会话窗口仍然可以“更新”,

    是的,这是正确处理乱序记录所必需的。我不确定 Kinesis 中对事件时间的支持是什么——它们的翻滚窗口似乎与 ROWTIME 对齐(这是挂钟时间吗?)。但是,使用suppress(),您可以在每个会话中只获得一个结果(通过权衡一些处理延迟)。查看这篇博文了解更多详情:https://www.confluent.io/blog/kafka-streams-take-on-watermarks-and-triggers

    在记录未来的“流时间”事件之前,可能不会发出会话?

    没错。但这只会发生在根本没有新数据到达的情况下,对于具有连续数据流的流处理应用程序来说,情况不应该如此。

    您还可以使用transform() 和窗口状态存储来实现您想要的逻辑。使用挂钟时间标点,即使没有新的输入数据到达,您也可以确保发出数据。最具挑战性的部分将是本案例中乱序记录的处理。

    【讨论】:

    • Kafka Streams 中还有新的 Suppress 功能。这也包含在 Matthias J. Sax 上面分享的链接中。对应的 Kafka 文档部分是kafka.apache.org/documentation/streams/developer-guide/…
    • 非常感谢您的回答,我认为这是不正确的,但是因为 Kafka 流文档状态“窗口与纪元对齐,区间下限包含在内,上限排除在外. “与纪元对齐”意味着第一个窗口从时间戳零开始 [不是像 [1452;6452) 等“随机”的东西]"
    • 不确定我是否可以关注。窗口对齐与“落后者”有何关系?请注意,窗口基于事件时间,而“落后者”(据我了解)是无序记录。即使窗口在 Kafka Streams 中对齐,如果数据在窗口结束时间过后到达,它仍然会包含在窗口中。
    • 请不要将“stagger”与“straggler”混淆。我建议您快速阅读交错窗口文档 (docs.aws.amazon.com/kinesisanalytics/latest/dev/…) 以了解我要求在 kafkta 中重新创建的内容。
    • 哦。我懂了。我之前只是跳过了它。我明白了,更仔细地阅读它。它基本上是固定大小的窗口,但它们的开始时间是数据驱动的......我会更新我的答案