Rocketmq中的NameServer主要负责两个工作,broker管理和路由管理。这篇文章主要是分析NameServer如何完成这两个工作的。
一、broker管理
broker会定时上报broker的基本信息以及主题信息给NameServer,NameServer会将这些信息存储到RouteInfoManager中
1. broker上报信息
我们看看broker启动时关于上报信息的代码
//位于BrokerController.start
this.registerBrokerAll(true, false, true);
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
BrokerController.this.registerBrokerAll(true, false, brokerConfig.isForceRegister());
} catch (Throwable e) {
log.error("registerBrokerAll Exception", e);
}
}
}, 1000 * 10, Math.max(10000, Math.min(brokerConfig.getRegisterNameServerPeriod(), 60000)), TimeUnit.MILLISECONDS);
可以看出,broker启动的时候会立刻向NameServer注册,然后会启动定时任务(默认30s)向NameServer同步自己的注册信息。
接下来关注具体的register操作。第一步,组装上报的信息,包括broker地址、brokerId、brokerName、clusterName、主题信息等
//位于BrokerOuterAPI.registerBrokerAll
final RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader();
requestHeader.setBrokerAddr(brokerAddr);
requestHeader.setBrokerId(brokerId);
requestHeader.setBrokerName(brokerName);
requestHeader.setClusterName(clusterName);
requestHeader.setHaServerAddr(haServerAddr)