流式处理系统通过使用事件时间处理、水位线和可配置的窗口策略来处理延迟到达的数据。这些系统优先处理基于事件实际发生的时间(事件时间)而不是它们到达的时间(处理时间)的数据。为了管理延迟,他们设置了等待延迟数据的时长阈值并增量更新结果。这确保了即使数据无序到达或在初始计算之后到达也能获得准确的结果。
一个核心机制是使用 水位线 (watermarks),它定义了系统期望在给定窗口中看到的最新事件时间。 例如,Apache Flink 允许开发人员设置水位线,以容忍延迟(例如,5 秒)。 任何在水位线通过窗口结束时间后到达的数据都被认为是延迟的。 系统通常将此与 允许的延迟 (allowed lateness) 配置相结合,该配置使窗口保持打开额外的周期(例如,10 分钟)以合并延迟数据。 在此期间,结果会被重新计算并作为更新发出。 例如,由于网络问题而延迟的用户活动事件如果其在允许的延迟时间内到达,仍然可以添加到每小时会话窗口中。 侧输出(或“延迟数据处理程序”)是另一个工具,使开发人员能够将延迟记录路由到单独的管道以进行日志记录或重新处理。
窗口策略也发挥着作用。 滑动或翻滚窗口可以与在水位线通过窗口结束时或延迟数据到达时触发的触发器配对。 例如,Google Dataflow 使用触发器来提前发出部分结果,并在延迟数据进入时对其进行细化。 状态管理在这里至关重要:系统必须保留窗口状态,直到允许的延迟时间到期。 Kafka Streams 等框架通过维护具有可配置保留策略的状态存储来处理此问题。 开发人员必须平衡延迟和准确性——更长的延迟时间可以提高完整性,但会增加资源使用量。 通过调整水位线、延迟阈值和状态保留,流式处理系统可以确保可靠地处理真实世界的数据延迟,同时提供及时的见解。