|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
nameserver如何与broker进行通信的?
|
|
|
|
|
# RockerMQ Nameserver 如何与 Broker 进行通信的?
|
|
|
|
|
|
|
|
|
|
nameserver 每隔 10s 扫描一次 Broker,移除处于未激活状态的 Broker
|
|
|
|
|
|
|
|
|
@ -6,7 +6,7 @@ nameserver每隔10s扫描一次Broker,移除处于未激活状态的Broker
|
|
|
|
|
|
|
|
|
|
`this.scheduledExecutorService.scheduleAtFixedRate(NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, 10, TimeUnit.*SECONDS*);`
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
```java
|
|
|
|
|
public int scanNotActiveBroker() {
|
|
|
|
|
int removeCount = 0;
|
|
|
|
|
Iterator<Entry<String, BrokerLiveInfo>> it = this.brokerLiveTable.entrySet().iterator();
|
|
|
|
@ -31,7 +31,7 @@ broker每隔30秒会向集群中所有的NameServer发送心跳包
|
|
|
|
|
|
|
|
|
|
核心代码:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
```java
|
|
|
|
|
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -45,7 +45,7 @@ this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
|
|
|
|
|
}, 1000 * 10, Math.max(10000, Math.min(brokerConfig.getRegisterNameServerPeriod(), 60000)), TimeUnit.MILLISECONDS);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
```java
|
|
|
|
|
public synchronized void registerBrokerAll(final boolean checkOrderConfig, boolean oneway, boolean forceRegister) {
|
|
|
|
|
TopicConfigSerializeWrapper topicConfigWrapper = this.getTopicConfigManager().buildTopicConfigSerializeWrapper();
|
|
|
|
|
|
|
|
|
@ -71,7 +71,7 @@ public synchronized void registerBrokerAll(final boolean checkOrderConfig, boole
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor 是网络处理器解析请求类型,如果请求类型为`*RequestCode.REGISTER_BROKER`,则请求最终转发到org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#registerBroker*
|
|
|
|
|
org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor 是网络处理器解析请求类型,如果请求类型为`*RequestCode.REGISTER_BROKER`,则请求最终转发到 org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#registerBroker\*
|
|
|
|
|
|
|
|
|
|
代码太多,文字来描述一下:
|
|
|
|
|
|
|
|
|
@ -83,7 +83,7 @@ org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor 是网络处理器
|
|
|
|
|
|
|
|
|
|
根据 topicConfig 创建 QueueData 数据结构然后更新 topicQueueTable
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
```java
|
|
|
|
|
private void createAndUpdateQueueData(final String brokerName, final TopicConfig topicConfig) {
|
|
|
|
|
QueueData queueData = new QueueData();
|
|
|
|
|
queueData.setBrokerName(brokerName);
|
|
|
|
@ -110,7 +110,7 @@ private void createAndUpdateQueueData(final String brokerName, final TopicConfig
|
|
|
|
|
|
|
|
|
|
第四步:更新 BrokerLiveInfo,存储状态正常的 Broker 信息表,BrokerLiveInfo 是执行路由删除操作的重要依据。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
```java
|
|
|
|
|
BrokerLiveInfo prevBrokerLiveInfo = this.brokerLiveTable.put(brokerAddr,
|
|
|
|
|
new BrokerLiveInfo(
|
|
|
|
|
System.currentTimeMillis(),
|
|
|
|
@ -121,7 +121,7 @@ BrokerLiveInfo prevBrokerLiveInfo = this.brokerLiveTable.put(brokerAddr,
|
|
|
|
|
|
|
|
|
|
第五步:注册 Broker 的过滤器 Server 地址列表,一个 Broker 上会关联多个 FilterServer 消息过滤服务器。如果此 Broker 为从节点,则需要查找该 Broker 的主节点信息,并更新对应的 masterAddr 属性
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
```java
|
|
|
|
|
if (MixAll.MASTER_ID!= brokerId) {
|
|
|
|
|
String masterAddr = brokerData.getBrokerAddrs().get(MixAll.MASTER_ID);
|
|
|
|
|
if (masterAddr != null) {
|
|
|
|
@ -150,7 +150,7 @@ NameServer如何剔除失效的Broker?
|
|
|
|
|
|
|
|
|
|
第一步:申请写锁,移除 brokerLiveTable、filterServerTable 中 Broker 相关的信息
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
```java
|
|
|
|
|
this.lock.writeLock().lockInterruptibly();
|
|
|
|
|
BrokerLiveInfo brokerLiveInfo = this.brokerLiveTable.remove(brokerAddr);
|
|
|
|
|
log.info("unregisterBroker, remove from brokerLiveTable {}, {}",brokerLiveInfo != null ? "OK" : "Failed",brokerAddr);
|
|
|
|
|