前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文搞懂 Flink 中的锁

一文搞懂 Flink 中的锁

作者头像
shengjk1
发布2020-12-31 11:51:08
1.1K0
发布2020-12-31 11:51:08
举报
文章被收录于专栏:码字搬砖码字搬砖

之前在介绍 flink timer 的时候( 一文搞懂 Flink Timer ) 官网有这样的一句话

Flink synchronizes invocations of onTimer() and processElement(). Hence, users do not have to worry about concurrent modification of state.

当时觉得特别奇怪,今天我们就一起来看一下,flink 是如何保证 onTimer 与 processElement 同步的以及其他使用 lock 的地方

一文搞定 Flink 消费消息的全流程 我们可以知道,当算子处理 msg 时,保持同步

代码语言:javascript
复制
// 这里就是真正的,用户的代码即将被执行的地方
						// now we can do the actual processing
						StreamRecord<IN> record = recordOrMark.asRecord();
						//处理每条 record lock
						// 所以如果是 window 由 processElement 导致的 window fire 也会被 lock 住
						synchronized (lock) {
							numRecordsIn.inc();
							//throught KeySelector set KeyContext setCurrentKey
							streamOperator.setKeyContextElement1(record);
							//处理数据
							streamOperator.processElement(record);
						}

一文搞懂 flink 处理水印全过程 我们可以知道下游算子处理水印时,会保持同步

代码语言:javascript
复制
public void handleWatermark(Watermark watermark) {
			try {
				// event time lock
				synchronized (lock) {
					watermarkGauge.setCurrentWatermark(watermark.getTimestamp());//gauge
					//处理 watermark 的入口
					operator.processWatermark(watermark);
				}
			} catch (Exception e) {
				throw new RuntimeException("Exception occurred while processing valve output watermark: ", e);
			}
		}

这是 event timer触发的过程, 同理 process timer

代码语言:javascript
复制
@Override
		public void run() {
			// process timer lock
			synchronized (lock) {
				try {
					if (serviceStatus.get() == STATUS_ALIVE) {
						target.onProcessingTime(timestamp);
					}
				} catch (Throwable t) {
					TimerException asyncException = new TimerException(t);
					exceptionHandler.handleAsyncException("Caught exception while processing timer.", asyncException);
				}
			}
		}

其中 lock 均来自于 StreamTask 的

代码语言:javascript
复制
private final Object lock = new Object();

另外 lock 除了应用于 ontimer() 与 processElement() 方法外,还应用于

处理水印、处理 record、triggerCheckpoint、kafka 发送 msg、update offset

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档