深入解析RocketMQ的名字服务机制:功能、原理与应用

news2024/9/28 21:19:52

NameServer 是专为 RocketMQ 设计的轻量级名字服务,它的源码非常精简,八个类 ,少于 1000 行代码。

这篇文章, 笔者会从基础概念Broker 发送心跳包NameServer 维护路由Zookeeper vs NameServer 四个模块揭秘名字服务的设计精髓。

1 基础概念

NameServer 是一个非常简单的 Topic 路由注册中心,其角色类似 Dubbo 中的 zookeeper ,支持 Broker 的动态注册与发现。

RocketMQ 集群工作流程:

1、NameServer 启动服务,监听 TCP 端口 , 集群多节点之间无任何信息交互,然后等待 Broker、Producer 、Consumer 连上来;

2、Broker 启动后,每隔 30 秒向所有的 NameServer 发送心跳命令 ;

3、NameServer 接收到请求之后,保存路由信息在本地内存里 ,将响应结果返给 Broker 服务;

4、Producer 启动之后,会随机的选择一个 NameServer ,并从 NameServer 中获取当前发送的 Topic 存在哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker 建立长连接从而向 Broker 发消息;

5、Consumer 跟 Producer 类似,跟其中一台 NameServer 建立长连接,获取当前订阅 Topic 存在哪些 Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息。

2 Broker 发送心跳包

我们贴一段 Broker 发送心跳命令的源码:

1、Broker 会每隔 30 秒向所有的 NameServer 发送心跳命令 ;

使用 CountDownLatch 实现多线程同步,可以获取发往所有的 NameServer 的心跳命令的响应结果

2、心跳命令包含两个部分:请求头和请求体

3 NameServer 维护路由

NameServer 在接收到 Broker 发送的心跳请求之后,通过默认的处理器来处理请求,保存路由信息成功后,注册成功状态返回给 Broker 服务。

源码中,我们可以看到路由信息保存在 HashMap 中 。

1、topicQueueTable:Topic 消息队列路由信息,包括 topic 所在的 broker 名称,读队列数量,写队列数量,同步标记等信息,rocketmq 根据 topicQueueTable 的信息进行负载均衡消息发送。

2、brokerAddrTable:Broker 节点信息,包括 brokername,所在集群名称,还有主备节点信息。

3、clusterAddrTable:Broker 集群信息,存储了集群中所有的 Brokername。

4、brokerLiveTable:Broker 状态信息,NameServer 每次收到 Broker 的心跳包就会更新该信息。

当 Broker 向 NameServer 发送心跳包(路由信息),NameServer 需要对 HashMap 进行数据更新,但我们都知道 HashMap 并不是线程安全的,高并发场景下,容易出现 CPU 100% 问题,所以更新 HashMap 时需要加锁,RocketMQ 使用了 JDK 的读写锁 ReentrantReadWriteLock 。

下面我们看下路由信息如何更新和读取:

1、写操作:更新路由信息,操作写锁

2、读操作:查询主题信息,操作读锁


我们可以将 NameServer 实现注册中心的方式总结为: RPC 服务 + HashMap 存储容器 + 读写锁 + 定时任务 。

1、NameServer 监听固定的端口,提供 RPC 服务

2、HashMap 作为存储容器

3、读写锁控制锁的颗粒度

4、定时任务

  • 每个 Broker 每隔 30 秒注册主题的路由信息到所有 NameServer
  • NameServer 定时任务每隔 10 秒清除已宕机的 Broker , 判断宕机的标准是:当前时间减去 Broker 最后一次心跳时间大于 2 分钟

4 Zookeeper vs NameServer

那为什么 RocketMQ 不用 Zookeeper 做为注册中心呢 ?

我们先温习下 CAP 理论。

CAP 理论是分布式架构中重要理论。

1、一致性 (Consistency) :所有节点在同一时间具有相同的数据;

2、可用性 (Availability) :保证每个请求不管成功或者失败都有响应 (某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求) ;

3、分隔容忍 (Partition tolerance) :系统中任意信息的丢失或失败不会影响系统的继续运作。 (在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用) 。

Zookeeper 是一个典型的 CP 注册中心 ,通过使 ZAB 协议来保证节点之间数据的强一致性。

笔者曾经遇到过一起神州专车服务宕机事故,zookeeper 集群不堪重负,一直在选主 。 架构负责人修改了 zookeeper 的 jvm 参数,重启集群后,才临时解决了问题。

因为 MetaQ 集群和服务治理共用一组 zookeeper 集群 。

  • MetaQ 消费者负载均衡时,会频繁的争抢锁 ,同时也会频繁的提交 offset ;
  • 专车的注册服务也越来越多,注册信息通过 Hession 序列化存储在 zookeeper 的节点。

为了减少 zookeeper 集群的性能压力,架构团队将 MetaQ 使用的 zookeeper 集群独立出来。

这次事故让我认识到: Zookeeper 作为 CP 注册中心,大规模使用场景下,它就变得很脆弱,我们要非常小心的使用。

淘宝中间件博客出了一篇文章 : 阿里巴巴为什么不用 ZooKeeper 做服务发现 ?

文章有两个观点,笔者认为非常有借鉴意义。

1、当数据中心服务规模超过一定数量 (服务规模 = F {服务 pub 数,服务 sub 数} ),作为注册中心的 ZooKeeper 很快就会像下图的驴子一样不堪重负。

2、可以使用 ZooKeeper,但是大数据请向左,而交易则向右,分布式协调向左,服务发现向右

相比 ZooKeeper ,NameServer 是一个典型的 AP 注册中心,它有如下优点:

1、代码不到 1000 行,实现简单,易于维护;

2、性能极好,除了网络消耗,基本都是本地内存操作;

3、服务都是无状态,且节点之间并不交互,运维简单;

RocketMQ 的设计者之所以选择自研名字服务,遵循着架构设计的准则,笔者总结为:简单高效适当妥协

没有完美的技术,只有合适的技术,与诸君共勉。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Paimon下载使用和基础操作说明

简介 Apache Paimon 是一种湖格式,支持使用 Flink 和 Spark 构建实时湖仓一体架构 用于流式处理和批处理操作。Paimon创新性地将湖格式与LSM(Log-structured merge-tree)相结合 结构,将实时流式更新引入 Lake 架构。 Paimon提供以…

力扣 203反转链表

思路 用cur->next指向pre,把链表倒转 cur后移,cur指向原链表的下一个 注意用tmp存储原链表中cur的后一个 class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *cur head; ListNode *pre nullptr; ListNode *tmp; while (cur ! nul…

echarts——横坐标轴文字过长如何换行

横坐标轴文字过长,想要换行 实现如下效果 具体实现代码如下: axisLabel: {show: true,interval: 0,formatter: function (value) {var ret "";//拼接加\n返回的类目项 var maxLength 4;//每项显示文字个数 var valLength value.length;//X轴类目项…

为何Expo成为React Native官方推荐框架?

在React Conf上,我们更新了关于构建React Native应用的最佳工具指南:一个React Native框架——一个工具箱,包含所有必要的API,让你可以构建生产就绪的应用。 现在,使用React Native框架(如Expo&#xff09…

快团团团长如何获得物流查询码以及如何查询呢?

快团团团长如何获得物流查询码以及如何查询呢? 一、功能说明 团长可自行生成物流查询码,直接将码发给顾客,顾客扫码可查询自己订单的物流状态! 用户扫码后,会出现用户在该团长处下单的所有快递订单。团员可查看该订…

js逆向第24例:FastMoss数据分析网站Fm-Sign加密字段破解

文章目录 一、前言二、定位关键参数三、代码实现一、前言 破解:FastMoss数据分析网站Fm-Sign加密字段 二、定位关键参数 先看一下网站加密字段是长什么样,如下图,老手估计一下子就能发现字段Fm-Sign:的密文类似md5加密后的结果。 直接全局搜索Fm-Sign:看来key也没有做混…

【模块化与包管理】:解锁【Python】编程的高效之道

目录 1.什么是模块? 2. 模块的导入过程 3. 理解命名空间 4. import语句的多种形式 5. 模块的执行与重新导入 6. 包(Package) 7. sys模块和os模块 sys模块 常用属性 示例:使用sys模块 os模块 常用功能 示例&#xff1…

asan检测内存泄漏

文章目录 前言初始代码链接asan动态库静态方式链接额外说明小结 前言 ASAN是一个内存问题检测工具 类似的还有valgrind, 但是valgrind运行时会占用非常多的内存 初始代码 #include<stdio.h> #include"arcojson.h"int leak_func() {arco_json* jtest new_js…

复兴社在李忠平的引领下,奋力实现伟大复兴

李忠平&#xff0c;河北保定人&#xff0c;1965年6月生&#xff0c;现任中国财政科学研究院公共资产研究中心副主任副研究员和复兴社会长。他的一生充满了奋斗与奉献&#xff0c;为实现共同富裕和中华民族的伟大复兴而不断努力。复兴社在他的领导下&#xff0c;正走在一条坚定而…

【Python】已解决:SyntaxError invalid syntax

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SyntaxError invalid syntax 一、分析问题背景 在Python编程中&#xff0c;SyntaxError: invalid syntax是一个常见的错误&#xff0c;它通常表示代码中存在语法…

【机器学习】必会数学知识:一文掌握数据科学核心数学知识点(下),收藏~

核心数学知识点 1、引言2、数据科学必会数学知识2.13 K均值聚类2.14 决策树2.15 随机森林2.16 梯度下降2.17 随机梯度下降&#xff08;SGD&#xff09;2.18 卷积2.19 拉普拉斯变换2.20 傅里叶变换2.21 信息论2.22 时间序列分析2.23 生成模型与判别模型2.24 支持向量机&#xff…

无刷电机带上驱动器,掉电外力拖动有阻力

无刷电机带上驱动器&#xff0c;掉电外力拖动有阻力 这个问题一直以为很好理解或者应该是总所周知的&#xff0c;但是竟然很多人好奇问专门做电机控制的工程师&#xff0c;但是竟然很多人说不明白&#xff0c;今天我就好好聊一聊。 原因 反电动势效应 当无刷电机在没有电源供…

市场营销新手入门:推荐5本让你快速成长的好书!

我过去面试过数千人&#xff0c;发现了一个非常有趣也让人担忧的现象&#xff1a; 无论是资深还是资浅的市场营销人士&#xff0c;如果被问及什么是市场营销&#xff0c;什么是品牌&#xff0c;什么是整合营销传播&#xff0c;市场营销组合与整合营销传播有什么区别&#xff0…

HippoRAG如何从大脑获取线索以改进LLM检索

知识存储和检索正在成为大型语言模型(LLM)应用的重要组成部分。虽然检索增强生成(RAG)在该领域取得了巨大进步&#xff0c;但一些局限性仍然没有克服。 俄亥俄州立大学和斯坦福大学的研究团队推出了HippoRAG&#xff0c;这是一种创新性的检索框架&#xff0c;其设计理念源于人类…

matlab数值溢出该怎么解决?

&#x1f3c6;本文收录于《CSDN问答解惑》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

Backend - C# 的日志Lognet4

目录 一、安装 log4net 插件 &#xff08;一&#xff09;作用 &#xff08;二&#xff09;操作 &#xff08;三&#xff09;注意 二、配置 &#xff08;一&#xff09;配置AssemblyInfo.cs &#xff08;二&#xff09;配置log4net.config 1. 创建log4net.config文件&#xff08…

【京东监控项目分享】JD电商可实现的商品价格SKU实时监控

笔者实现了一个京东商品价格和评论的采集监控系统&#xff0c;它具有以下功能。 可以在任意时间周期内按照一定时间间隔&#xff0c;采集任意指定商品的价格和最新评论&#xff0c;都是网页可见的公开数据&#xff0c;不包含任何隐私数据。 对于消费者来说&#xff0c;如果订阅…

《C++20设计模式》策略模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 策略模式和状态模式实现方式一样&#xff0c;只是目的不同&#xff0c;如果会状态模式的这个也就可以随便看看啦。 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_moder…

RocketMQ-六大场景实操指南

RocketMQ-六大场景实操指南 普通消息创建Topic创建Group测试消息收发 定时消息创建Topic创建Group消息发送 事务消息创建Topic创建Group消息收发 顺序消息创建Topic创建Group消息收发 另外两大场景消息异常运维体验感受初次体验给小白新手的建议进阶体验应用场景 关于云消息队列…

Excel第28享:如何新建一个Excel表格

一、背景需求 小姑电话说&#xff1a;要新建一个表格&#xff0c;并实现将几个单元格进行合并的需求。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“XLS工作表”或“XLSX工作表”都可以&#xff0c;如下图所示。 之后&…