3.事件-时间(Event-Time)处理
在“时间语义”中,我们强调了在流处理应用中时间语义的重要性,并解释了处理时间与事件时间的不同点。处理时间较好理解,因为它基于本地机器的时间,它产生的是有点任意的、不一致的、以及无法复现的结果。而事件时间的语义产生的是可复现的、一致性的结果,它对于很多流处理场景是一个硬性的要求。然而,相对于处理时间语义,事件时间语义应用需要额外的配置,并且引入了更多的系统内部构件。
Flink为常见的event-time处理操作提供了直观、并易于使用的原型。同时也提供了清晰的APIs,用于为用户自定义的operators实现更高级的event-time应用。有一个对Flink内部时间处理的理解,对与这类高级应用的开发与理解是很有帮助的,有时候也是必须的。前一章介绍过Flink依赖的两个用于提供事件时间语义的概念:record时间戳和水印。下面我们会介绍Flink内部是如何实现并处理时间戳与水印,从而为流应用提供事件-时间语义。
时间戳
所有由Flink事件-时间流应用生成的条目都必须伴随着一个时间戳。时间戳将一个条目与一个特定的时间点关联起来,一般这个时间点表示的是这条record发生的时间。不过application可以随意选择时间戳的含义,只要流中条目的时间戳是随着流的前进而递增即可。
当Flink以事件-时间的模式处理流数据时,它基于条目的时间戳来评估(evaluate)基于时间(time-based)的operators。例如,一个time-window operator根据条目的时间戳,将它们分派给不同的windows。Flink将时间戳编码为16-byte,Long类型的值,并将它们以元数据(metadata)的方式附加到流记录(records)中。它内置的operators将这个Long型的值解