有没有什么办法能处理Flink长期延迟的数据呢?
水印机制(水位线、watermark)可以帮助我们在短期延迟下,允许乱序数据的到来。
这个机制很好的处理了那些因为网络等情况短期延迟的数据,让窗口等它们一会儿。
但是水印机制无法长期的等待下去,因为水印机制简单说就是让窗口一直等在那里,等达到水印时间才会触发计算和关闭窗口
这个等待不能一直等,因为会一直缓着数据不计算。

那么,在现实世界中,延迟数据除了有短期延迟外,长期延迟也是很常见的。
比如:
客户端断网,等了好几个小时才恢复
车联网系统进入隧道后没有信号无法上报数据
手机欠费没有网
等等,这些场景下数据的迟到就不是简单的网络堵塞造成的几秒延迟了
而是小时、天级别的延迟。
对于水印来说,这样的长期延迟数据是无法很好处理的。
那么有没有什么办法去处理这些长期延迟的数据呢?让其可以找到其所属的窗口正常完成计算,哪怕晚了几个小时。
这个场景的解决方式就是:延迟数据处理机制(allowedLateness方法)。
水印:乱序数据处理(时间很短的延迟)
延迟处理:长期延迟数据的处理机制
waterMark和Window机制解决了流式数据的乱序问题,对于因为延迟而顺序有误的数据,可以根据eventTime进行业务处理,对于延迟的数据Flink也有自己的解决办法,
主要的办法是给定一个允许延迟的时间,在该时间范围内仍可以接受处理延迟数据
设置允许延迟的时间是通过allowedLateness(lateness: Time)设置
保存延迟数据则是通过sideOutputLateData(outputTag: OutputTag[T])保存
获取延迟数据是通过DataStream.getSideOutput(tag: OutputTag[X])获取
后续的文章我们先分别讲解这几个方法,再给出具体的实例加深理解
