Timely Stream Processing 是 Stateful Streaming Processing 的一种扩展。

在处理 Stream 中的记录时,记录中通常会包含各种典型的时间字段,Flink 支持多种时间的处理,如下图所示:

Processing Time

Processing Time 代表某个 Operator 对事件进行处理事的本地系统时间(是在 TaskManager 节点上)

Event Time

通常根据 Event Time 会给整个 Streaming 应用带来一定的延迟性,因为在一个基于事件的处理系统中,进入系统的事件可能会基于 Event Time 而发生乱序现象。

比如事件来源于外部的多个系统,为了增强事件处理吞吐量会将输入的多个 Stream 进行自然分区,每个 Stream 分区内部有序,但是要保证全局有序必须同时兼顾多个 Stream 分区的处理,设置一定的时间窗口进行暂存数据,当多个 Stream 分区基于 Event Time 排列对齐后才能进行延迟处理。

所以,设置的暂存数据记录的时间窗口越长,处理性能越差,甚至严重影响 Stream 处理的实时性。

有关基于时间的 Streaming 处理,可以参考官方文档,在 Flink 中借鉴了 Google 使用的 WaterMark 实现方式,可以查阅相关资料

Windowing

Flink 支持基于时间窗口操作,也支持基于数据的窗口操作,如下图所示:

上图中,基于时间的窗口操作,在每个相同的时间间隔对 Stream 中的记录进行处理,通常各个时间间隔内的窗口操作处理的记录数不固定。

而基于数据驱动的窗口操作,可以在 Stream 中选择固定数量的记录作为一个窗口,对该窗口中的记录进行处理。

有关窗口操作的不同类型,可以分为如下几种:

  • 倾斜窗口(Tumbling Windows,记录没有重叠)
  • 滑动窗口(Slide Windows,记录有重叠)
  • 会话窗口(Session Windows)

具体可以查阅相关资料。

Reference