概要
Flink1.19心跳机制实现原理
以ResourceManager与TaskManager(TaskExecutor)之间的心跳为例
整体架构流程
1.resourcemanager的onstart()方法
2.调用startResourceManagerServices()
3.调用startHeartbeatService()方法,在这个方法里启动心跳服务
4.创建taskManagerHeartBeatManager对象,我们点进createHeartBeatManagerSender方法,在这个方法内部创建了定时调度的线程池发送心跳
5.mainThreadExecutor定时调度的线程池,在这里我们能看到delay为0L,也就是说立刻会调用到this对象的run方法(下面),进入run方法,我们能看到有一个getHeartbeatTargets()方法,我们点进这个方法
6.返回得到一个heartbeatTargets对象,调用他的values()方法,返回一个map。
map中key为resourceid,value为heartbeatMonitor对象。
7.我们可以看到这个for循环在遍历这个map,对于每一个kv,会发送一个requestHeartbeat(心跳请求)。那这个map中到底存了什么,什么时候向map存数据的呢?我们继续往下看
得前面一篇文章讲到了taskexecutor向resourcemanager注册,taskexecutor向RM注册会发送注册请求消息,最后被RM的registerTaskExecutor方法接收处理,在这个方法中,就向这个map中存储数据了
8.
进入registerTaskExecutorInternal方法
9.重要‼️taskManagerHeartbeatManager.monitorTarget这个方法里就向map存储值了n
10.我们可以看到heartbeartTargets.put()向这个map里存值,每一个kv对应着一个taskmanager或者jobmaster
11.这个时候我们再回头看这个定时调度的任务,此时map中有值,会调用requestHeartbeat()方法,点进这个方法
12.调用requestHeartbeat()方法,传进去两个参数,一个是resourceid(每一个tm后者jobmaster都有唯一resourceid),另一个payload,是发送的消息数据,下面的whencompleteAsync是心跳消息发送后,失败或者成功的逻辑就在这里面,我们继续点进requestheartbeat()方法
13.可以看到这里用到了动态代理,最终调用到taskexecutor的heartbeatFromresourcemanager方法中
14.点进requestheartbeat
15.点进receiveHeartBeat方法
17.taskexecutor接受到心跳后再向rm发送心跳,如此反复