Flink 第8.1章 Flink Timer 机制原理,源码整理。

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

参考:

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。

Window Trigger 例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值