序
参考:
Flink Timer(定时器)机制与其具体实现_LittleMagics的博客-优快云博客
4 characteristics of Timers in Apache Flink to keep in mind
Flink程序 Timer实现定时操作_保护我方胖虎的博客-优快云博客_flink 定时任务
其实大多数 Flink Timer 实现的都是根据 LittleMagics 发表的文章进行加工改造,但是大佬的思路有点跳跃,有些地方个人认为没有表现很清楚,所以摸索着大佬的主线,自己啃了一遍源码写出这篇文章。
全文word显示5K字,优快云显示9K字,推荐阅读时间1hour(跟随源码)。
最后的图还是放到前面来,跟随图来查询事半功倍:

Timer 简介
Timer 定时器 是 Flink Streaming API 提供的用于感知时间变化并且进行处理的机制。
所以对于业务来说,最常用的就是在 KeyedProcessFunction 的时候利用 Timer 机制。我们在其 processElement() 方法中注册 Timer,然后覆写 onTimer() 方法作为 Timer 触发时的回调逻辑。
根据时间特征的不同,我们分为以下两种:
处理时间
调用 Context.timerService().registerProcessingTimeTimer() 注册;
onTimer() 在系统时间达到 Timer 设定的时间戳时触发。
事件时间
调用 Context.timerService().registerEventTimeTimer() 注册;
onTimer() 在 Watermark 达到或者超过 Timer 设定的时间戳时触发。
KeyedProcessFunction 最简单的 Timer 触发
KeyedProcessFunction
一般来说,我们显式的调用 Timer 比较常用的就是 KeyedProcessFunction 低阶函数进行数据处理。

我们可以在 processElement 方法中,执行我们需要的数据逻辑处理和 Timer 的开启。
onTimer 方法则是定时器触发执行的具体方法。
实例
比如我们可以设置一种来一条数据就设置一个 Timer,并且过一段时间后触发的代码:

我们将键存储在 State 中,Timer 进行调用。所以就可以使用 processElement() 方法中注册 Timer。
然后使用 DataGeneratorSource 进行数据创建,调用使用:

但一般在生产环境中并不会这样使用,单个数据的 Timer 大概率会导致 Timer 过多,而性能无法支撑。
Window Trigger 触发
除了 KeyedProcessFunction 之外, Timer 还可以在窗口机制中有重要地位。提起窗口自然就能想到 Trigger,比如 ProcessingTimeTrigger 的部分代码(这个是事件时间特征下的默认触发器)。
org.apache.flink.streaming.api.windowing.triggers.ProcessingTimeTrigger

可以看到内部有三个方法: onElement、onEventTime、onProcessingTime。
在 ProcessingTime 中就关心 onProcessingTime 和 onEventTime,而 onElement 是基于事件时间的,所以并不会在 ProcessingTrigger 中进行调用。
当 Watermark 还没有到达窗口的右边沿的时候,就注册以窗口右边沿为时间戳的 Timer。当 Timer 到期后触发 onProcessingTime() 方法,进而触发该窗口相关联的 Trigger。

本文深入探讨了Apache Flink中的Timer机制,包括处理时间和事件时间触发,以及它们在KeyedProcessFunction和WindowTrigger中的应用。文章详细解析了Timer的注册、触发和删除过程,介绍了TimerService、InternalTimerService以及TimerHeapInternalTimer的工作原理,揭示了Flink如何管理和调度Timer。通过源码分析,阐述了Timer的保存、触发回调以及在KeyGroup中的去重策略。
最低0.47元/天 解锁文章
1522

被折叠的 条评论
为什么被折叠?



