启动一个定时任务,默认每30秒发送一次注册心跳到Nameserver,最短10秒最长60秒。
\
注册流程
启动时,Broker 一定会执行
public synchronized void registerBrokerAll(final boolean checkOrderConfig, boolean oneway, boolean forceRegister) {
TopicConfigSerializeWrapper topicConfigWrapper = this.getTopicConfigManager().buildTopicConfigSerializeWrapper();
//......省略
if (forceRegister || needRegister(this.brokerConfig.getBrokerClusterName(),
this.getBrokerAddr(),
this.brokerConfig.getBrokerName(),
this.brokerConfig.getBrokerId(),
this.brokerConfig.getRegisterBrokerTimeoutMills())) {
doRegisterBrokerAll(checkOrderConfig, oneway, topicConfigWrapper);
}
}
forceRegister:默认为true
needRegister:
Broker 会去请求所有的 NameServer,查询自己传给 NameServer 的数据,然后跟自己本地的数据版本做一个对比。
只要有任何一台 NameServer 的数据是旧的,Broker 就会重新执行心跳,换句话说:needRegister() 的判定就会为 true。这里给大家准备了一副判定过程的流程图,来方便大家理解:
一次心跳逻辑。心跳的流程也很好理解,因为它不仅仅是心跳本身,还会传输数据,而这就必然会涉及到和投递 Message 类似的操作,即构建 Header、Body,然后发送请求,如下图所示:
在多nameserver情况下,broker会开线程并发的去执行心跳,等待所有心跳结束统一返回,结束阻塞继续处理命令。
心跳传输的数据
数据详情: broker中的topic信息与对应messagequeue信息,
数据版本:上次更新时间戳与版本号