21.RocketMQ源码之NameServer的路由管理和架构设计


highlight: arduino-light

NameServer

路由管理

Broker消息服务器在启动的时向所有NameServer注册。

消息生产者Producer在发送消息之前先从NameServer获取Broker服务器地址列表然后根据负载均衡算法从列表中选择一台服务器进行发送。

NameServer与每台Broker保持长连接,并且每间隔30S通过心跳检测Broker是否存活,如果120秒内没收到broker的上报消息(NameServer每隔10s扫描一次Broker,移除不活跃的Broker。),那么就认为检测到Broker宕机,则从路由注册表中删除。

但是路由变化不会马上通知消息生产者。这样设计的目的是为了降低NameServer实现的复杂度,在消息发送端提供容错机制保证消息发送的可用性。

NameServer本身的高可用是通过部署多台NameServer来实现,但彼此之间不通讯,也就是NameServer服务器之间在某一个时刻的数据并不完全相同,但这对消息发送并不会造成任何影响,这也是NameServer设计的一个亮点,总之,RocketMQ设计追求简单高效,这也是高可用放弃强一致性的体现。

NameServer的主要作用是为消息的生产者和消息消费者提供关于主题Topic的路由信息,那么NameServer需要存储路由的基础信息,还要管理Broker节点,包括路由注册、路由删除等。

路由元信息

路由元信息类:RouteInfoManager

//集群和brokerName关系 private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable; ​ //brokerName和broker实例的关系:比如地址&主从等信息 private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable; ​ //topic和brokerName以及 queue对应关系 //topic是一个逻辑概念一个topic下的queue可能在多个broker上面 //比如topicA 可能有2个queue分别在broker-a broker-b private final HashMap<String/* topic */, List<QueueData>> topicQueueTable; ​ //broker实例存活信息,主要是根据上一次和nameServer的心跳通信时间判断 private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable; private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

topicQueueTable: Topic消息队列路由信息,消息发送时根据路由表进行负载均衡

brokerAddrTable: Broker基础信息,包括brokerName、所属集群名称、主备Broker地址

clusterAddrTable: Broker集群信息,存储集群中所有Broker名称

brokerLiveTable: Broker状态信息,NameServer每次收到心跳包是会替换该信息

filterServerTable: Broker上的FilterServer列表,用于类模式消息过滤。

RocketMQ基于定于发布机制,一个Topic拥有多个消息队列,一个Broker为每一个主题创建8个读队列和8个写队列。

多个Broker组成一个集群,集群由相同的多台Broker组成Master-Slave架构,brokerId为0代表Master,大于0为Slave。BrokerLiveInfo中的lastUpdateTimestamp存储上次收到Broker心跳包的时间。

image.png

image.png

Broker-Topic-Queue之间关系

image.png

/*** Topic可以理解为在rocketMq体系当中作为一个逻辑消息组织形式,一般情况下一类业务消息会申请一个topic来实现业务之间隔离。 ​ Topic是一个逻辑上的概念,实际上在每个broker上以queue的形式保存,也就是说每个topic在broker上会划分成几个逻辑队列,每个逻辑队列保存一部分消息数据,但是保存的消息数据实际上不是真正的消息数据,而是指向commit log的消息索引。 ​ 每个broker上面的queue保存了该topic的一部分消息。一个Broker可以存放多个Topic的queue。 即一个topic可以对应多个broker 一个broker对应多个queue。 每个queue也维护了对应的brokerName。 ​ 一个Topic被创建时,默认几个读写队列? 使用命令是8个 ***/

架构设计

Broker消息服务器在启动的时向所有NameServer注册,消息生产者(Producer)在发送消息时之前先从NameServer获取Broker服务器地址列表,然后根据负载均衡算法从列表中选择一台服务器进行发送。发送到该topic所在的broker的某一个queue上。

每台Broker与NameServer保持长连接,并且Broker每间隔30S会发送一次心跳检测,如果120秒内没收到broker的上报消息(NameServer每隔10s扫描一次Broker,移除不活跃的Broker。),那么就认为检测到Broker宕机,则从路由注册表中删除。

但是路由变化不会马上通知消息生产者。这样设计的目的是为了降低NameServer实现的复杂度,在消息发送端提供容错机制保证消息发送的可用性。当消息发送失败时会继续轮询选择下一个broker来发送消息。

NameServer本身的高可用是通过部署多台NameServer来实现,但彼此之间不通讯,也就是NameServer服务器之间在某一个时刻的数据并不完全相同,但这对消息发送并不会造成任何影响,这也是NameServer设计的一个亮点。

感觉这里和eureka很像。保证高可用的AP。总之,RocketMQ设计追求简单高效

问题1:broker故障感知

如果某一台消息服务器broker宕机了,那么消息生产者如何在不重启服务情况下感知呢?

所有的broker都要和nameServer做通信。通过心跳感知broker是否存活。

同时 nameServer每隔10s扫描一次Broker,移除不活跃的Broker。

移除broker是根据broker的lastUpdateStamp+2分钟是否小于当前时间,如果小于就移除。

即如果broker在2分钟内都没有发送心跳 那么就移除该broker

问题2:消息发送到哪台broker

为了避免消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。

那消息生产者如何知道消息要发送到哪台消息服务器呢?

生产者发送消息到指定的topic时,会根据topic从nameServer拉取所有的broker和broker关联的queue的信息。

遍历轮询每个queue,然后选择一个queque发送信息。

一个topic可以存储在多个broker,一个broker可以存储多个queue。

生产者遍历所有的queue依次发送。

image.png

Broker消息服务器在启动的时向所有NameServer注册,消息生产者(Producer)在发送消息时之前先从NameServer获取所有的Broker服务器地址列表,然后根据负载均衡算法从列表中选择一台服务器进行发送。

NameServer与每台Broker保持长连接,并且每间隔30S通过心跳检测Broker是否存活,如果120秒内没收到broker的上报消息,那么就认为检测到Broker宕机,则从路由注册表中删除。但是路由变化不会马上通知消息生产者。NameServer每隔10s扫描一次Broker,移除不活跃的Broker。

这样设计的目的是为了降低NameServer实现的复杂度,在消息发送端提供容错机制保证消息发送的可用性。具体就是故障规避机制。

NameServer本身的高可用是通过部署多台NameServer来实现,但彼此之间不通讯,也就是NameServer服务器之间在某一个时刻的数据并不完全相同,但这对消息发送并不会造成任何影响,这也是NameServer设计的一个亮点,总之,RocketMQ设计追求简单高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4664.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Microsoft Excel中快速筛选数据

你通常如何在 Excel 中进行筛选?在大多数情况下,通过使用自动筛选,以及在更复杂的场景中使用高级过滤器。 使用自动筛选或 Excel 中的内置比较运算符(如“大于”和“前10项”)来显示所需数据并隐藏其余数据。筛选单元格或表范围中的数据后,可以重新应用筛选器以获取最新…

移动端微信小程序学习

目录 小程序和web端的不同 小程序的宿主环境 通信 组件 视图容器​编辑 text组件 button image ​编辑 API api三大分类 模板语法 事件绑定 ​编辑 事件传参​编辑 bindinput 条件渲染 列表渲染 ​编辑 全局配置 window 页面配置 网络数据请求 ​编辑 GET请求 POST…

从电源 LED 读取智能手机的秘密?

研究人员设计了一种新的攻击方法&#xff0c;通过记录读卡器或智能手机打开时的电源 LED&#xff0c;使用 iPhone 摄像头或商业监控系统恢复存储在智能卡和智能手机中的加密密钥。 众所周知&#xff0c;这是一种侧信道攻击。 通过密切监视功耗、声音、电磁辐射或执行操作所需…

轻松生成高质量用例的API接口工具

1、前言 随着自动化测试技术的普及&#xff0c;已经有很多公司或项目&#xff0c;多多少少都会进行自动化测试。 目前本部门的自动化测试以接口自动化为主&#xff0c;接口用例采用 Excel 进行维护&#xff0c;按照既定的接口用例编写规则&#xff0c;对于功能测试人员来说只…

置换检验临界值

置换检验和t检验一样&#xff0c;会有统计值和P值。 置换检验的统计值记为Z值 其中这个Z和t检验的t一样&#xff0c;是有大小分别的。 例如b为1和2的分类变量&#xff0c;那么Z正值代表1大于2。 我们知道t检验的t值换算成P值&#xff0c;是需要自由度的。 例如在这个数据中&a…

【C#】文件拖拽,获取文件路径

系列文章 【C#】编号生成器&#xff08;定义单号规则、固定字符、流水号、业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

海兰一体机电脑U盘重装Win10系统教程图解

海兰一体机电脑是全家人都适用的电脑&#xff0c;使用海兰一体机电脑的用户要怎么用U盘来重装Win10系统&#xff0c;首先用户需要确保电脑能够正常联网&#xff0c;然后再准备一个8G以上的U盘&#xff0c;最后根据小编分享的海兰一体机电脑U盘重装Win10系统教程图解操作即可。 …

SpringBoot+Prometheus采集Metrics指标数据

简介 本文介绍在springboot3.x里配置启用系统指标监控功能&#xff0c;来监视系统各项Metrics指标&#xff0c;从而实时了解应用的运行健康状态&#xff0c;通过promtheus服务提供数据收集与指标可视化方案&#xff1b; Metrics指标 metrics指标表示应用程序代码运行中提供的…

Xcode 14打包flutter 的项目构建失败

升级xcode 后flutter项目构建失败 起因&#xff1a; 升级Xcode 到新的14.3.1版本 错误&#xff1a; showing recent issues command phasescriptexecution failed with a nonzero exit code 这个错误很多情况下都会出现&#xff0c;所以参考价值较低。 解决&#xff1a; …

webrtc源码阅读之examples/peerconnection

阅读webrtc源码&#xff0c;从examples中的peerconnection开始。版本m98。 一、 基本流程 server端只是做了一个http server&#xff0c;来转发client端的消息。也就是起到了信令服务器的作用&#xff0c;本篇文章不在研究&#xff0c;感兴趣的可以学习一下用cpp搭建http serv…

【技术新趋势】面向图像文档的版面智能分析与理解

目录 一、什么是OCR&#xff1f;什么是版面分析理解&#xff1f;二、文档版面分析2.1、版面布局类型2.2、面向文档图像版面分析的实例分割2.3、逻辑结构分析 三、文档版面理解3.1、位置嵌入3.2、表格数据提取 四、智能文档处理技术新解决方案 人类撰写文档是为了记录和保存信息…

网络空间安全专业未来的发展前景以及薪资待遇如何?

不管是考虑未来报读专业的准大学生&#xff0c;还是初入职场的实习生&#xff0c;亦或是想要跳槽转岗的职场人&#xff0c;当我们开始选择一份工作时&#xff0c;本质上都在考虑以下三个问题&#xff1a; 这份工作的收入水平如何&#xff1b;这份工作有没有发展前景&#xff1…