处理无限数据流时,需要将时间划分为有限的片段以计算聚合结果。虽然基本的滚动窗口足以满足简单的监控需求,但精确的流处理,则需处理事件发生时间与到达操作符时间之间的不一致性。这种差异,通常由网络延迟或分布式系统滞后引起,使得精确的时间属性和窗口操作逻辑变得必要。本章考察 Flink 用来追踪时间进程并管理窗口内状态的机制。我们侧重区分 事件时间与处理时间,以及在事件乱序到达时如何保持数据准确性。你将分析水位线作为时间进程主要标志的作用。水位线 $W(t)$ 在流中传递,表明所有时间戳小于 $t$ 的事件均已到达。除了标准的时钟对齐窗口,我们将实现动态窗口操作策略。用户行为常以爆发式出现,而非固定间隔,这使得会话窗口(根据活动间隔对事件进行分组)成为一种更准确的数据分析模型。我们还将配置自定义触发器和淘汰器。这些组件让你可以定义复杂的条件,决定何时评估窗口内容或清除数据,提供了超出默认行为的控制能力。处理延迟数据是构建可靠数据管道的必需。丢弃水位线之后到达的事件可以降低延迟,但通常会违反严格的一致性要求。我们将配置允许的延迟参数,并将延迟到达的事件路由到侧输出,确保所有数据都得到处理,即使它们超出预期的时间范围。到本章结束时,你将能实现窗口操作逻辑,在延迟、完整性和准确性之间取得平衡。