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

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://xiahunao.cn/news/3225920.html

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

相关文章

容联七陌智能客服助力企业出海无忧,拓展全球

随着全球化的加速,企业寻求海外市场的第二增长曲线。然而,文化差异、语言障碍和市场竞争等挑战随之而来。在全球化商业活动的不断推进中,企业面临着跨文化沟通、多语言服务和数据安全等挑战。容联七陌,作为中国SaaS智能客服领域的…

django农产品销售系统-计算机毕业设计源码65418

基于HTML5的农产品销售系统的设计与实现 摘 要 本文针对农产品销售系统存在的传统销售方式效率低下、信息交流困难等问题,基于HTML5进行了系统的设计与实现。首先,通过对当前农产品销售系统的现状和问题进行分析,提出了基于HTML5的系统设计方…

RAID的主要应用场景

将服务器的系统安装在RAID上,将服务器的系统直接去安装在磁盘上是不允许的。 创建RAID,依赖的具体是服务器上的RAID卡提供的操作界面。 磁盘阵列柜去创建RAID,磁盘阵列柜中都有RAID卡, 具体不同服务器去安装RAID的操作流程可以在网…

2024年的设计理念革新:快速获取设计趋势的资源集合!

随着2024年第三季度开始,今年的设计趋势也逐渐出现。与2023 年设计相比,趋势变化空间不大,大部分是在 2023 年度设计趋势的延伸和发展。即使趋势不会一直改变,了解趋势对设计师来说仍然非常重要。接下来,本文将与你分享…

哈喽GPT-4o,程序员如何通过GPT-4o提高办公效率

目录 一、编写工作汇报Prompt:我是一名Java开发工程师,请写一份工作总结,工作内容是一个SpringBootVue实现的图书管理系统,按下面的结构来撰写:1. 工作背景;2. 工作内容;3. 工作建议&#xff1b…

香菜面爆卖 2800 万+,仅为康师傅1/7的方便面四巨头之末,白象如何通过极致产品力突围?

康师傅、统一在国内方便面市场上占据大半江山版图,白象只能在夹缝中生存。据方便食品大会数据显示,白象市场份额约为7%。曾经一段时间内,我们在超市货架上都很难看到白象的身影,可想而知白象在激烈的市场竞争中被“打压”的多么惨…

7.深度学习概述

深度学习概述 1. 线性回归1.1 线性回归一般表达式1.2 线性回归内积表达方式:1.3 多个样本时,线性回归的进一步表达:1.4 线性回归方程的解析1.5 线性回归就是求loss函数的最小值 2. 如何求函数最小值2.1 一个例子2.2 求导法——求最小值2.3 求…

从零开始开发视频美颜SDK:实现直播美颜效果

因此,开发一款从零开始的视频美颜SDK,不仅可以节省成本,还能根据具体需求进行个性化调整。本文将介绍从零开始开发视频美颜SDK的关键步骤和实现思路。 一、需求分析与技术选型 在开发一款视频美颜SDK之前,首先需要进行详细的需求…

悠律凝声环Ringbuds Pro耳机:素皮纹理质感独一档,音质也拉满

悠律(UMELODY)推出的这款新品——凝声环开放式耳机,以其独特的设计风格和出色的音质表现赢得了众多消费者的喜爱。 在外观上,凝声环采用了时尚潮酷的设计理念,并且采用简约典雅素皮工艺,首次将“素皮”材料…

OpenShift3.11 社区版搭建

一、资源规划 HostnameIPOSCPUMemDiskmaster192.168.78.131CentOS7.92vCPU4G60Gnode1192.168.78.132CentOS7.92vCPU4G60Gnode2192.168.78.133CentOS7.92vCPU4G60G 二、安装过程: 2.1 前期配置 开启所有节点的 SELinux (所有主机执行) gr…

钡铼技术有限公司S270用于智慧物流中心货物追踪与调度

钡铼技术有限公司的第四代S270是一款专为智慧物流中心设计的工业级4G远程遥测终端RTU,其强大的功能和灵活性使其成为货物追踪与调度的理想选择。 技术规格和功能特点 钡铼S270支持多种通信协议,包括短信和MQTT,这使得它能够与各种云平台如华…

儿童房灯具什么牌子好?几款儿童房灯具款式墙裂分享

随着科技的不断发展和生活方式的改变,儿童青少年近视率的增长趋势引起了人们的关注。近视不仅对孩子们的视力健康构成威胁,还可能对他们的学习和日常生活带来不便。因此,如何有效地预防和改善儿童青少年的视力问题成为了一个亟待解决的课题。…

【JavaEE】Spring AOP详解

一.AOP的定义. Aspect Oriented Programming(面向切面编程)概括的来说AOP是一种思想, 是对某一类事情的集中处理 什么是面向切面编程呢? 切面就是指某一类特定问题, 所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢? 比如上个博客文章…

餐饮管理系统-计算机毕业设计源码43667

餐饮管理系统 摘 要 在信息化、数字化的时代背景下,餐饮行业面临着前所未有的挑战与机遇。为了提高运营效率、优化顾客体验,餐饮企业亟需一套高效、稳定且灵活的管理系统来支撑其日常运营。基于Spring Boot的餐饮管理系统应运而生,成为餐饮行…

【Linux】:程序替换

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序替换的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门…

蓝牙人员定位精准吗?是否会对人体有伤害?

不知道大家现在使用的蓝牙人员定位系统都是什么样的呢?其实就出行而言,使用GPS定位也就是足够了的,而且目前的定位相对也比较精准了,效果还是很不错的。但是如果说是室内定位,很显然常规的定位系统是无法满足使用需求的…

【背就有效】软考中级信息系统监理师核心知识点汇总!

宝子们!上半年软考已经告一段落了,准备下半年考信息系统监理师的小伙伴可以开始准备了。这里给大家整理了信息系统监理师核心知识点汇总,涵盖全书90%的重点,先把这个存下!再慢慢看书,边看书边背这个&#x…

【机器学习】主成分分析(PCA):数据降维的艺术

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 主成分分析(PCA):数据降维的艺术引言PCA的基…

Plaxis Python API的连接与配置、外部Python编译器的使用、Python命令流自动建模过程,典型岩土工程案例

目录 第一部分 Plaxis软件简介及 Plaxis Python API环境搭建 第二部分 Plaxis自动化建模-基础案例 第三部分 进阶案例—Python全自动实现 第四部分 高级案例—Python全自动实现 有限单元法在岩土工程问题中应用非常广泛,很多软件都采用有限单元解法。在使用各大…

平凉崆峒区特产美食亮相兰洽会文旅康养展馆

在第三十届兰洽会的文旅康养展馆中,平凉的特产无疑是一道亮丽的风景线。作为促进区域经济合作与交流的重要平台,每年都吸引着众多企业和特色产品的亮相。 走进这个充满活力与特色的展馆,首先映入眼帘的是琳琅满目的特色产品。平凉红牛的…