路由删除|学习笔记

简介: 快速学习路由删除

开发者学堂课程【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删除,维护路由表。

相关文章
|
存储 运维 监控
双11黑科技,阿里百万级服务器自动化运维系统StarAgent揭秘
还记得那些年我们半夜爬起来重启服务器的黑暗历史吗?双11期间,阿里巴巴百万量级主机管理能安全、稳定、高效,如丝般顺滑是如何做到的?阿里巴巴运维中台技术专家宋意,首次直播揭秘阿里IT运维的基础设施StarAgent,详细分析StarAgent是如何支持百万级规模服务器管控?如何像生活中的水电煤一样,做...
17222 16
|
8月前
|
消息中间件 存储 设计模式
RocketMQ原理—5.高可用+高并发+高性能架构
本文主要从高可用架构、高并发架构、高性能架构三个方面来介绍RocketMQ的原理。
2867 21
RocketMQ原理—5.高可用+高并发+高性能架构
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
10月前
|
机器学习/深度学习 算法 TensorFlow
机器学习中的图像处理与计算机视觉
在现代计算机科学中,图像处理和计算机视觉已成为最活跃的研究领域之一,这得益于机器学习和深度学习的发展。本文将深入探讨图像处理与计算机视觉的基础概念、常见应用、关键技术、常用工具,以及在这些领域中的代码示例。通过本篇文章,我们将了解如何从头开始构建一个简单的计算机视觉系统,并探索这些技术背后的原理。
|
Windows
Windows操作系统部署安装Kerberos客户端
详细介绍了在Windows操作系统上部署安装Kerberos客户端的完整过程,包括下载安装包、安装步骤、自定义安装路径、修改环境变量、配置hosts文件和Kerberos配置文件,以及安装后的验证步骤。
1655 3
Windows操作系统部署安装Kerberos客户端
|
Linux
如何配置静态路由?
【8月更文挑战第15天】如何配置静态路由?
2048 1
|
存储 固态存储 Linux
systemd-analyze:Linux系统启动性能分析的利器
`systemd-analyze`是Linux下分析systemd启动性能的工具,它提供启动时间统计、服务耗时、依赖关系及图形化展示。通过`blame`查看服务启动时间,`critical-chain`显示关键路径,`plot`生成启动时间线图。使用时注意日志完整性,优化服务顺序,并结合最佳实践提升启动效率。
|
监控 网络协议 网络安全
免费网站监控工具推荐
如果您正在寻找一款免费、功能强大且易于使用的网站监控工具,Spug 监控助手绝对是您的不二之选。无论您是个人站长还是企业管理员,Spug 监控助手都能满足您的网站监控需求。
472 9
|
Java Nacos Docker
通过dockerfile构建微服务的镜像发布
通过dockerfile构建微服务的镜像发布
271 1
|
机器学习/深度学习
【Python-Keras】keras.layers.BatchNormalization解析与使用
BatchNormalization是一种用于深度神经网络的规范化方法,通过在每个batch上规范化前一层的激活值,加快模型训练速度,提高稳定性,并减少对初始化权重的敏感性,允许使用更大的学习率。
393 1