Dubbo采用双向心跳的方式检测Client端与Server端的连通性。
1 心跳请求的发送
在信息交换层服务端实现类HeaderExchangeServer
和客户端实现类HeaderExchangeClient
中包含一个 心跳定时任务HeartBeatTask:
- HeaderExchangeServer和HeaderExchangeClient启动时会创建一个定时线程池执行心跳定时任务,关闭时会同时关闭该心跳定时任务;
- HeartBeatTask会循环检测Client或Server中绑定的网络通道Channel,将通道中 最近一次接收或发送消息 的时间与当前时刻做比较,如果两者相隔超过了一个 心跳周期 ,则主动构建并通过Channel 向对端发送一个 心跳请求消息;
2.2 心跳请求的接收及处理
在请求接收的Handler处理链路中,包含有一个 心跳消息处理器HeartbeatHandler:
对于所有类型的请求消息,该处理器都会更新对应通道中 最近一次接收消息 的时间;
对于心跳请求消息,该处理器接收心跳请求并构建对应的心跳响应通过通道Channel发送回去;
2.3 心跳超时的检测及处理
在信息交换层服务端实现类HeaderExchangeServer和客户端实现类HeaderExchangeClient中包含一个 心跳定时任务HeartBeatTask:
HeartBeatTask会循环检测Client或Server中绑定的网络通道Channel,当发现通道中 最近一次接收消息 的时间与当前检测时间间隔超过 心跳超时时间 时,会触发心跳超时逻辑的执行;
对于服务端,心跳超时发生时,会调用channel.close()主动断连对应通道;
对于客户端,心跳超时发生时,会调用client.reconnect()执行网络通道重连逻辑。如果重连失败则不做处理等待下次心跳超时检测时再次触发重连逻辑;
网友评论