简介
本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics,future。
本文解释心跳组件,心跳组件监听组件间连接活性,超时触发重连,保证连接有效性;断连后通知并释放资源,心跳可以带荷载,作为组件间数据交换的方式
心跳组件依赖rpc组件实现通讯,rpc的解释可参考本系列flink源码分析之功能组件(三)-rpc组件
心跳组件
心跳组件通过定时心跳,监视组件被管理组件的存活,心跳可携带载荷信息,实现轻量级实时/准实时的信息交换
心跳组件依赖rpc组件实现通讯服务,关于rpc组件参考相关的分析章节
心跳组件有两个角色:sender和receiver。检测动作是Sender主动发起请求,Reciver给Sender回一个心跳,在这一个来回sender和receiver相互检测。
设计类图
上图是心跳设计类图
HeartbeatServices 与其他模块一样,flink的代码习惯, ***Services是构建工厂,负责抓取配置,构建服务
HeartbeatTarget 监控目标接口,requestHeartbeat/receiveHeartbeat两个方法,分别是发送心跳请求,接收心跳请求
HeartbeatSender HeartbeatTarget发送(Sender)实现基类,屏蔽receiveHeartbeat方法
HeartbeatReceiver HeartbeatTarget接收(Receive)实现基类,屏蔽senderHeartbeat方法
HeartbeatMonitor 心跳监测器,管理HeartbeatTarget,设置心跳监听器,超时通知
DefaultHeartbeatMonitor 心跳检测器实现,内置定时执行器,定时检查超时,通知客户
HeartbeatManager HeartbeatTarget管理器,负责启停HeartbeatTarget,自身是HeartbeatTarget实现,形成合成模式,操作HeartbeatTarget集合与操作单个HeartbeatTarget一致的接口,有两个实现:
HearbeatManagerImpl 实现为心跳Receiver器管理器
HeartbeatManagerSenderImpl 实现为心跳Sender管理器,继承自HearbeatManagerImpl,自身实现了Runnable接口,并内置ScheduledExecutor,定时发送心跳请求
管理器主要方法是monitorTarget,增加心跳目标
HeartbeatListener 用户实现 心跳监听,载荷通知;负责构建载荷
心跳
心跳是心跳组件的主要职责,sender和receive通过心跳,相互检测监控状态,可搭载负载,实时交换信息。
心跳的过程解释在下面示例章节结合作业管理器-任务管理器心跳解释
超时检测
超时是Sender在设定时间未收到目标返回心跳,认为目标组件已不可用,通知上级调用者心跳超时
超时检测是DefaultHeartbeatMonitor负责,
重置超时检查
前面解释了,DefaultHeartbeatMonitor实现了Runable接口,内置ScheduledExecutor
下面方法resetHeartbeatTimeout,重置延时执行方法,延时也是超时的时间,方法有两重意思,停止前面的延时;设置新的延时
DefaultHeartbeatMonitor构造函数调用了该方法初始设置
run方法
延时时间到了,也即心跳超时,State的4个状态,其中
UNREACHABLE rpc异常
CANCELED 认为停止
TIMEOUT 只有run方法设置
因此,不执行超时的唯一方法就是不执行run方法,即延时到达前叫停ScheduledExecutor
重设超时
reportHeartbeat报告收到心跳,调用重置超时检查,重新设置延时,实际就是叫停并重置ScheduledExecutor
reportHeartbeat是HearbeatManagerImpl接收到心跳返回时调用receiveHeartbeat,调用reportHearbeat,就是说,在心跳检查延时前收到心跳回应,心跳超时检查就会被重置
示例
本节以作业管理器与任务管理器心跳为例,解释心跳组件原理和使用。作业管理器是心跳管理者,管理多个任务管理器
构建
作业管理器和任务管理器构建心跳管理器,并设置心跳目标
- 作业管理器
作业管理器对任务管理器的心跳管理是Sender,即心跳发起者
作业管理器的心跳管理器设置任务管理器心跳目标,指向任务管理器
心跳目标继承自HeartbeatSender,并带载荷AllocatedSlotReport,任务管理器的资源slot分配报告
- 任务管理器
与作业管理器对应,任务管理器对作业管理器的心跳管理器是Reciver,接收者;心跳管理器设置作业管理器心跳目标,继承自HeartbeatReceiver
心跳
心跳的流程,定时请求-->rpc发送请-->接收方处理心跳请求,返回-->发送方处理接收方的返回
请求
发送管理器自身实现Runable接口,使用Executor延时发送心跳请求
下图管理器发送心跳方法,发送者(Sender)也带了载荷,当然监听器可以返回null
请求返回处理handleHeartbeatRpc后面监听章节解释
发送心跳请求
发送器(Sender)调用目标的rpc gateway方法
接收方
另一边,任务管理器rpc gateway taskExecutorGateway处理请求
作为Receiver的心跳管理器requestHeartbeat方法,上面的Sender重写了该方法,这里也是让人觉得混乱的地方,读者要注意的点,对比Sender的该方法,Receiver调用心跳目标的receivieHeartbeat方法
作为接收方,心跳管理器目标实现为Reciever,即实现了receivieHeartbeat方法,对应上面的requestHeartbeat方法
心跳回应方法receiveHeatbeat调用作业管理器gateway方法,带上荷载
发送方
最后回到发送方作业管理器的rpc gateway的heartbeatFromTaskManager方法
心跳管理器的receiveHeartbeat方法,报告心跳(reportHeartbeat),重置超时;报告荷载
处理心跳返回
上一节,请求时提过,请求完成的异步处理handleHeartbeatRpc
这里不详细介绍,根据是否有异常分别处理
总结
发送心跳-接收和返回-处理返回,一个完整心跳来回过程,相互检测,相互传递载荷