详解WatermarkStrategy在Flink中的两种使用方式
在Flink1.11中就已经发现assignTimestampsAndWatermarks的有些实现过渡了,从Flink1.12版本开始,官网推荐用WatermarkStrategy。

背景
在flink 1.11之前的版本中,提供了两种生成水印(Watermark)的策略,分别是AssignerWithPunctuatedWatermarks和AssignerWithPeriodicWatermarks,这两个接口都继承自TimestampAssigner接口。
但是用户想要使用不同的水印生成方式,则需要实现不同的接口,这样就引发了一个问题,对于想要给水印添加一些通用的、公共的功能则变得复杂,因为我们需要同时给这两个接口添加新的功能,这样还造成了代码的重复。
所以为了避免代码的重复,在flink 1.11中对flink的水印生成接口(WatermarkStrategy)进行了重构。
Watermark应用代码结构
WatermarkStrategy在Flink中有两种使用方式:
一种是直接在数据源上使用
另一种是直接在非数据源的操作之后使用
推荐使用第一种方式,因为数据源可以利用watermark生成逻辑中有关分片/分区的信息。使用这种方式可以更精准的跟踪watermark,整体的watermark生成将更精准,直接在数据源指定watermarkStrategy必须使用特定的数据源接口,例如与kafka链接,使用kafka Connerctor,只有当无法直接在数据源上设置策略时才使用第二种方式
在数据源直接使用时如果因为数据源中的任何一个分区/分片在一段时间内未发送事件数据,则意味着watermarkStrategy也不会获得数据去生成watermark,在这种情况下可以通过设置有一个空闲时间,当超过这个时间则将该分片或分区标记为空闲状态。
