路由删除|学习笔记

简介: 快速学习路由删除

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)路由删除】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12467


路由删除

 

路由删除

Broker每隔30s向Nameserver发送一个心跳包,心跳包包含BrokerTd,Broker地址,Broker名称,Broker所属集群名称。

Broker关联的Fi1terserver列表。但是如果Broker宕机,Nameserver无法收到心跳包,此时Nameserver如何来剔除这些失效的Broker? Nameserver会每隔10s扫描brokerLiveTable状态表,如果BrokerLive的lastUpdateTimestamp的时间戳距当前时间超过120s,则认为Broker失效,移除该Broker,关闭与Broker连接,同时更新topicQueueTable、brokerAddrTable、brokerLiveTable、filterserverTable。

RocketMQ有两个触发点来删除路由信息:

• NameServer定期扫描brokerLiveTable检测上次心跳包与当前系统的时间差,如果时间超过120s,则需要移除broker。

• Broker在正常关闭的情况下,会执行unregisterBroker指令

这两种方式路由删除的方法都是一样的,就是从相关路由表中删除与该broker相关的信息。

根据下图再结合代码讲解路由删除的流程:

image.png

根据NameServer定期扫描删除路由信息,找到NameServer,里面有NamesrvController,在NamesrvController中有线程池,线程池是每隔10s扫描没有上报信息的broker

相关代码:

this.scheduledExecutorservice.scheduleAtFixedRate(new Runnable() {

@override

public void run() {NamesrvController.this.routeInfoManager.scanNotActiveBroker();

}

},initialDelay:5,period:10,TimeUnit.sECONDS);

每隔10s执行下面所示方法:

public void scanNotActiveBroker() {

Iterator<Entry<String,BrokerLiveInfo>> it = this.brokerLiveTable.entrySet().iterator();

while (it.hasNext())i

Entry<string,BrokerLiveInfo> next = it.next();

long last = next.getvalue().getLastupdateTimestamp();

if ((last + BROKER_CHANNEL_EXPIRED_TIME)<system.curren

tTimeMillis()){

Remotingutil.closechannel(next.getvalue().getchanne1());

it.remove();

log.warn("The broker channel expired,{}{ms ", next.getKey(),BROKER_CHANNEL_EXPIRED_TINIE);this.onchannelDestroy(next.getKey(),next.getvalue().getchannel());

}

}

}

这个方法里面,首先是遍历brokerLiveTable,然后是获得BrokerLivelnfo的lastupdateTimestamp,如果这个时间加上当前的120s还小于system.currentTimeMillis(),就认为这个broker出现宕机。之后首先是关闭连接通道,接着移除该broker信息,在onchannelDestroy方法里传递broker的IP地址及当前通道信息,并负责维护其他的路由表,比如维护brokerAddrTable、BrokerNameMclusterAddrTable、根据BrokerName队列集合移除Broker。根据流程图,整个维护路由表的过程是加锁的,也是同步化的。

this.lock. readLock().lockInterruptibly();

terator<Entry<string,BrokerLiveInfo>> itBrokerLiveTable =

this.brokerLiveTable.entryset().iterator();

while (itBrokerLiveTable.hasNext()){

Entry<string,BrokerLiveInfo> entry = itBrokerLiveTable.next();

if (entry.getvalue().getchannel() == channel) {

brokerAddrFound = entry.getKey();

break;

}

}

}finally{

在上面代码组成的方法中去维护brokerLiveTable、filterserverTable还有brokerAddrtable

this. 1ock.writeLock() . lockInterruptibly();

this.brokerLiveTable.remove( brokerAddrFound) ;this.filterServerTable.remove(brokerAddrFound);

string brokerNameFound = null;

boolean removeBrokerName = false;

Iterator<Entry<string,BrokerData>> itBrokerAddrTable =

this.brokerAddrTable.entryset().iterator();

while (itBrokerAddrTable.hasNext() && (null == brokerNameFound)) {

BrokerData brokerData = itBrokerAddrTable.next().getvalue();

当以上table都维护完成之后,会进行判断,如果当前队列里为空,会将TopicQueueTable删除,因为没有一个broker可以处理topic,故主题应该删除。

if (queueDataList.isEmpty()) {

itTopicQueueTable.remove();

Log.info("remove topic[i}] all queue,from topicQueueTable,because channel destroyed",

topic);

}

上面所有都完成之后会释放lock。

总结:在路由删除过程中主要设计三个类,一个是NameServerController,它在初始化之后会开启一个线程池去不断扫描brokerLiveTable,如果发现一个broker超过120s未上报信息,会进行broker删除,维护路由表。

相关文章
|
存储 NoSQL MongoDB
第一个路由节点创建|学习笔记
快速学习第一个路由节点创建
100 0
第一个路由节点创建|学习笔记
|
消息中间件 RocketMQ 开发者
路由发现和小结|学习笔记
快速学习路由发现和小结
105 0
路由发现和小结|学习笔记
|
弹性计算 网络安全 网络架构
添加自定义路由|学习笔记
快速学习添加自定义路由
277 0
添加自定义路由|学习笔记
|
网络协议 网络架构
路由与交换系列之简单的路由策略与默认路由汇总路由的运用
路由策略使用不同的匹配条件和匹配模式选择路由和改变路由属性。在特定的场景 中,路由策略的6种过滤器也能单独使用,实现路由过滤。
3650 1
路由与交换系列之简单的路由策略与默认路由汇总路由的运用
|
安全 Java 开发者
路由访问映射规则|学习笔记
快速学习路由访问映射规则
105 0
|
移动开发 前端开发 JavaScript
前端路由解析(二) —— history路由
前端路由解析(二) —— history路由
216 0
前端路由解析(二) —— history路由
|
缓存 网络协议 Linux
Linux网络管理之route命令 – 显示并设置路由
route命令用来显示并设置linux内核中的网络路由表,route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。
483 0
Linux网络管理之route命令 – 显示并设置路由
【laravle】在设置路由时注意点
【laravle】在设置路由时注意点
66 0
【laravle】在设置路由时注意点
|
数据库 开发者 Python
路由参数处理 | 学习笔记
快速学习路由参数处理
【教程】如何修改路由表?
1、打开开始菜单 - 运行 - 输入CMD,然后点确定     2、在下面的界面中输入添加路由的命令:Route add 需要分流IP mask 255.255.255 本地出口IP。
3230 0