《RockectMQ实战与原理解析》Chapter4-分布式消息队列的协调者
4.1 NameServer 的功能
NameServer 是整个消息队列中的状态服务器,集群的各个组件通过它来了解全局的信息 。 同时,各个角色的机器都要定期向 NameServer 上报自己的状态,超时不上报的话, NameServer 会认为某个机器出故障不可用了,其他的组件会把这个机器从可用列表里移除。
NamServer 可以部署多个,相互之间独立,其他角色同时向多个 NameServer机器上报状态信息,从而达到热备份的目的。 NameServer 本身是无状态的,也就是说 NameServer 中的 Broker 、 Topic 等状态信息不会持久存储,都是由各个角色定时上报并存储到内存中的(NameServer 支持配置参数的持久化, 一般用不到) 。
4.1.1 集群状态的存储结构
org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager有五个变量RouteInfoManager.javahttps://gitee.com/apache/rocketmq/blob/develop/namesrv/src/main/java/org/apache/rocketmq/namesrv/routeinfo/RouteInfoManager.java
/*** 这个结构的 Key 是 Topic 的名称,它存储了所有 Topic的属性信息。* Value 是个 QueueData 队列 , 队里的长度等于这个 Topic数据存储的* Master Broker 的个数, QueueData 里存储着 Broker 的名称、读写* queue 的数量 、 同步标识等*/private final Map<String/* topic */, Map<String, QueueData>> topicQueueTable;/*** 以 BrokerName 为索引 ,相同名称的 Broker 可能存在多台机器, 一个* Master 和多个 Slave 。 这个结构存储着一个 BrokerName 对应的属性信* 息,包括所属的 Cluster 名称, 一个 Master Broker 和多个 Slave Broker * 的地址信息 。*/private final Map<String/* brokerName */, BrokerData> brokerAddrTable;/*** 存储的是集群中 Cluster 的信息,结果很简单,就是一个 Cluster 名称对* 应一个由 BrokerName 组成的集合。*/private final Map<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;/*** 这个结构和 BrokerAddrTable 有关系,但是内容完全不同,这个结构的* Key 是 BrokerAddr ,也就是对应着一台机器, BrokerAddrTable 中的 Key* 是 BrokerName , 多个机器的 BrokerName 可以相同 。 BrokerLiveTable* 存储的内容是这台 Broker 机器的实时状态,包括上次更新状态的时间戳, * NameServer 会定期检查这个时间戳 ,超时没有更新就认为这个 Broker 无效了,* 将其从 Broker 列表里清除。*/private final Map<BrokerAddrInfo/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;/*** FilterServer 是过滤服务器,是 RocketMQ 的一种服务端过滤方式,一* 个 Broker 可以有 一个或多个 FilterServer 。 这个结构的 Key 是 Broker* 的地址, Value 是和这个 Broker 关联的多个 FilterServer 的地址。*/private final Map<BrokerAddrInfo/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
4.1.2 状态维护逻辑
因为其他角色会主动向Name Server 上报状态,所以 NameServer 的主 要逻 辑在 DefaultRequest Processor 类中,根据上报消息里的请求码做相 应 的处理, 更新存储的对应信息 。 此外,连接断开的 事 件也 会 触发状态 更新,具体逻辑在org.apache.rocketmq.namesrv.routeinfo.BrokerHousekeepingService
当 NameServer 和 Broker 的长连接断掉以后, onChannelDestroy 函数会被调用,把这个 Broker 的信息清理出去 。
NameServer 还有定时检查时间戳的逻辑 , Broker 向 NameServer 发送的心跳会更新时间戳, 当 NameServer 检查 到时间戳长时间没有更新后,便会触发清理逻辑 。
org.apache.rocketmq.namesrv.NamesrvController 每5s检查一次
4.2 各个角色间的交互流程
4.2.1 交互流程源码分析
创建 Topic 的代码 是 在 org.apache.rocketmq.tools.command.topic 里的UpdateTopicSubCommand 类中,创建 Topic 的命令 是 updateTopic
UpdateTopicSubCommand.javahttps://gitee.com/apache/rocketmq/blob/develop/tools/src/main/java/org/apache/rocketmq/tools/command/topic/UpdateTopicSubCommand.java
org.apache.rocketmq.tools.command.topic.UpdateTopicSubCommand#execute 调用org.apache.rocketmq.tools.admin.DefaultMQAdminExt#createAndUpdateTopicConfig
是向 NameServer 发 送注 册 信 息, NameServer 完 成创 建Topic 的逻辑后,其他客户端才能发现新增 的 Topic ,相关逻辑在org.apache.rocketmq.namesrv. routeinfo.RouteInfoManager#registerBroker,首先更新 Broker 信息,然后对每个 Master 角色的 Broker ,创建一个QueueData 对象。 如果是新建 Topic ,就是添加 QueueData 对象;如果是修改Topic ,就是把旧的 QueueData 删除 , 加入新的 QueueData 。
4.2.2 为何不用 ZooKeeper
RocketMQ 的架构设计决定了它不需要进行 Master 选举,用不到这些复杂的功能,只需要一个轻量级的元数据服务器就足够了 。 5 张图告诉你 RocketMQ 为什么不使用 Zookeeper 做注册中心 - 腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/2118883
4.3 底层通信机制
4.3.1 Remoting 模块
RocketMQ 的通信相关代码在 Remoting 模块里,先来看看主要类结构
NettyRemotingClient、NettyRemotingServer而 且 都继承了NettyRemoting-Abstract 类 。通过上面的封装 , RocketMQ 各个模块间的通信, 可以通过发送统一格式的自定义消息 ( RemotingCommand ) 来完成, 各个模块间的通信实现简洁明了 。
比如 NameServer 模 块中, NameServerController 有 一 个 remotingServer 变量 , NameServer 在启动时初始化各个变量 , 然后启 动 remotingServer 即可,剩下 NameServer 要 做的 是专心实现处理 RemotingCommand 的逻辑。
org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#processRequest
4.3.2 协议设计和编解码
RocketMQ 自己定义了一个通信协议,使得模块间传输的二进制消息和有意义 的内 容之间互相转换。
1 )第一部分是大端 4 个字节整数,值等于第二、三、 四部分长度的总和;
2 )第二部分是大端 4 个字节整数,值等于第三部分的长度;
3 )第三部分是通过 Json 序列化的数据;
4 )第四部分是通过应用自定义二进制序列化的数据。
消息的解码过程在 RemotingCommand 的 decode 函数里org.apache.rocketmq.remoting.protocol.RemotingCommand#decode(io.netty.buffer.ByteBuf)
org.apache.rocketmq.remoting.protocol.RemotingCommand#encode
4.3.3 Netty 库
RocketMQ 是基于 Netty 库来完成 RemotingServer 和 RemotingClient 具体的通信实现的, Netty 是个事件驱动的网络编程框架,它屏蔽了 Java Socket 、 NIO等复杂细节,用户只需用好 Netty ,就可以实现一个“ 网络编程专家+并发编程专家”水平的 Server 、 Client 网络程序 。 应用 Netty 有一定的门槛,需要了解它的 EventLoopGroup 、 Channel 、 Handler 模型以及各种具体的配置。 RocketMQ利用 Netty 实现的通信类是 NettyRemotingServer 和 NettyRemotingClient ,用户也可以参考这两个类的实现来学习使用 Netty 。
相关文章:

《RockectMQ实战与原理解析》Chapter4-分布式消息队列的协调者
4.1 NameServer 的功能 NameServer 是整个消息队列中的状态服务器,集群的各个组件通过它来了解全局的信息 。 同时,各个角色的机器都要定期向 NameServer 上报自己的状态,超时不上报的话, NameServer 会认为某个机器出故障不可用了…...

Spring Boot 最适配的 UI 是什么
与Spring Boot一起使用的最佳 UI 是什么? 我经常碰到的一个常见问题是“与 Spring Boot 一起使用的最佳 UI 是什么?” UI,也称为“用户界面”,有许多不同的风格。 UI 应用程序可能是用 Java Swing、FX 或其他一些技术编写的桌面应…...

TensorFlow 1.x 深度学习秘籍:6~10
原文:TensorFlow 1.x Deep Learning Cookbook 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如…...

分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?
所有的资源管理系统都需要解决资源的有效利用、任务的有效响应、调度策略的灵活配置这三个最基本问题。那么在分布式的场景下,YARN和Kubernetes是怎么解决的呢?本篇进行介绍。 — Apache YARN — YARN全称为(Yet Another Resource Negotiato…...

RK3399平台开发系列讲解(基础篇)POSIX 定时器
🚀返回专栏总目录 文章目录 一、clockid二、sigevent三、timerid四、flags五、 value & old_value六、POSIX 定时器的优势沉淀、分享、成长,让自己和他人都能有所收获!😄 📢为了克服传统定时器的局限性,POSIX 标准组织设计了新的计时器接口和规范,使它们能提供更…...

web小游戏开发:扫雷(三)(完成度90%)
web小游戏开发:扫雷(三) 实现布雷鼠标事件处理左键和右键单独实现实现递归展开追加地雷计数和时间计时小结书接前文啊,如果没看过前两篇的话,不好理解这里的定义了哦。 实现布雷 在之前两篇文章,我们已经把雷区布置好了,全部盖上了格子,现在我们需要把雷布出来,这就需…...

创建菜单栏、菜单、菜单项
1、QMainWindow窗口 1.1、创建菜单栏 this 代表的是 当前窗口(主窗口),也就是 当前窗口中添加/设置 菜单栏 this->resize(800,600); //创建 菜单栏 QMenuBar *menuBar new QMenuBar(this); //将菜单栏 添加到主窗口的特殊位置 this-&g…...

专访丨AWS量子网络中心科学家Antía Lamas谈量子计算
Anta Lamas Linares(图片来源:网络) 47岁的Anta Lamas Linares出生于西班牙西北部的圣地亚哥德孔波斯特拉。她在当地学习物理学,然后在牛津大学和加利福尼亚继续深造。后来,她在新加坡领导了亚马逊网络服务…...

[ 云计算 | Azure ] Chapter 04 | 核心体系结构之数据中心、区域与区域对、可用区和地理区域
本章节主要内容进行讲解:Azure云计算的核心体系结构组件中的:Azure物理基础设施(Physical infrastructure),区域(Regions)和区域对(Region Pairs)、地理数据中心…...

升级长江存储最新闪存,忆恒创源发布新一代企业级NVMe SSD
2023年4月11日 —— 北京忆恒创源科技股份有限公司(Memblaze)正式发布搭载高品质国产闪存的PBlaze6 6541 系列企业级PCIe 4.0 NVMe SSD。作为 MUFP 平台化开发的最新作品,PBlaze6 6541 采用长江存储最新一代晶栈 Xtacking 3D NAND,…...

Xcode14:”Failed to prepare the device for development“解决
当前Xcode版本14.2,测试机iOS版本16.4, 结果出现提示:Failed to prepare the device for development,经过Clean,重装都无效,最后发现其他人也有类似的问题 https://developer.apple.com/forums/thread/714388 PS:首先…...

程序员的“灵魂笔记本“:五款高效笔记软件推荐
大家好,我是 jonssonyan。作为一名程序员,我们经常需要记录和整理大量的代码、知识和项目信息,以便在日后能够高效地进行查阅和复用。而好用的笔记软件则成为了我们的"灵魂笔记本",帮助我们提高工作效率。在这篇文章中&…...

Linux基础命令-scp远程复制文件
Linux基础命令-seq打印数字序列 前言 有时候不可避免的需要将文件复制到另外一台服务器上,那么这时就可以使用scp命令远程拷贝文件,scp命令是基于SSH协议,在复制的过程中数据都是加密过的,会比明文传输更为安全。 一.命令介绍 …...

【python学习】基础篇-列表元素排序操作 sort()、min()、max()函数
列表对象中提供了 sort0 方法,该方法用于对原列表中的元素进行排序,排序后原列表中的元素顺序将发生改变。 其语法格式如下: listname.sort(keyNone, reverseFalse) key:用于比较的键 reverse:可选参数,Fal…...

机器视觉检测系统的基本流程你知道吗
工业制造业种,首先我们便需要了解其基本流程,作为工厂信息科人员,我们不能只依靠视觉服务商的巡检驻检来解决问题,为了产线的效率提升,我们更多的应该培养产线技术人员,出现问题便可以最快速度解决问题&…...

【vue】Vue 开发技巧:
文章目录1.路由参数解耦2.功能组件3.样式范围4.watch的高级使用5.watch监听多个变量6.事件参数$event7.程序化事件监听器8.监听组件生命周期1.路由参数解耦 通常在组件中使用路由参数,大多数人会做以下事情。 export default {methods: {getParamsId() {return th…...

Kubebuilder Hello World
Kubebuilder Hello World 摘要:从0开始建立kubebuilder第一个程序 文章目录Kubebuilder Hello World0. 环境 简介0.1 环境0.2 什么是kubebuilder?1. 安装Kubebuilder1.1 需要预先准备好的环境1.2 安装kubebuilder & kustomize2. 项目初始化2.1 新建…...

SpringSecurity之权限方案——用户认证
目录 前言 设置用户名密码 1、通过配置文件设置用户名密码 2、编写代码实现接口 放行登录页面以及静态资源 前言 前面我们讲解了一些关于Security的基础知识及基本原理。我们今天看一下如何通过他实现一个简单的web权限认证方案! 设置用户名密码 1、通过配置…...

本地电脑轻松部署GPT4(无需账号)!
最近有个超级好玩的Github开源代码分享给大家,可以实现直接在本地电脑上运行GPT4,实现给机器人对话,获得想要的内容,亲测好用!废话不多说,直接上干货! 目录 一、Github项目地址 二、操作步骤 2.1 下载代码 2.2 操作方法 2.3 详细步骤...

每天一道大厂SQL题【Day21】华泰证券真题实战(三)
每天一道大厂SQL题【Day21】华泰证券真题实战(三) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…...

腾讯云8核16G18M轻量服务器CPU带宽流量性能测评
腾讯云轻量应用服务器8核16G18M带宽,18M公网带宽下载速度峰值可达2304KB/秒,相当于2.25M/s,系统盘为270GB SSD盘,3500GB月流量,折合每天116GB流量。腾讯云百科分享腾讯云轻量服务器8核16G18M配置、CPU型号、公网带宽月…...

算法之归并排序
文章目录一、归并排序(递归版)二、归并排序(非递归版)一、归并排序(递归版) 归并排序思想:将数组划分为两个区间,左区间,右区间 然后对这两个区间内容进行排序 ÿ…...

Mysql日志系统-mysql serve层
Mysql日志系统-服务层的日志 mysql给我们提供了很多有用的日志有mysql服务层提供的,有innodb引擎层提供的,下表是mysql服务层给我们提供的: 日志类型写入日志的信息二进制日志记录了对MySQL数据库执行更改的所有操作慢查询日志记录所有执行…...

阿里云蔡英华:云智一体,让产业全面迈向智能
4月11日,在2023阿里云峰会上,阿里云智能首席商业官蔡英华表示,算力的飞速发展使数字化成为确定,使智能化成为可能。阿里云将以云计算为基石,以AI为引擎,参与到从数字化迈向智能化的划时代变革中。 基于服务…...

打怪升级之FPGA组成原理(LE部分)
FPGA芯片逻辑单元的原理 不论你使用哪一款FPGA芯片,其核心可编程逻辑单元都是从一段内存种按顺序读取执行并执行的过程。具体来说,FOGA芯片内部包括可编程逻辑块(LAB)、可配置输入输出单元(IOE)、时钟管理模块、嵌入式RAM(BRAN,在Cyclone IV…...

c++的多态
目录 1、多态 1.1多态的构成条件 1.2多态的好处 2、虚函数 2.1虚函数重写 2.2虚函数的默认参数 2.3纯虚函数重写 2.4抽象类 2.5虚析构,纯虚析构重写 3、重载、覆盖(重写)、隐藏(重定义)的对比 编辑 多态是c面向对象三大特性之一 程序调用函数时&#…...

【数据结构与算法】堆的实现(附源码)
目录 一.堆的概念及结构 二.接口实现 A.初始化 Heapinit 销毁 Heapdestroy B.插入 Heappush 向上调整 AdjustUp 1.Heappush 2.AdjustUp C.删除 Heappop 向下调整 AdjustDown D.堆的判空 Heapempty 堆顶数据 Heaptop 堆的大小 Heapsize 三.源码 Heap.h He…...

win10彻底永久关闭自动更新【亲测有效】
一、禁用Windows Update服务 1、同时按下键盘 Win R,打开运行对话框,然后输入命令 services.msc ,点击下方的“确定”打开服务,如下图所示。 2、找到 Windows Update 这一项,并双击打开,如图所示。 3、右击…...

【Unity UPR】造个获取深度法线纹理的轮子
描边需要深度法线纹理的加持,效果才能达到最好,但URP下很多版本不支持直接获取_CameraNormalsTexture,而我本人也尝试了一下在12.1.7下偷懒直接拿SSAO里的Depth Normal图, 虽然也能实现吧,但是需要打开SSAO的同时&…...

用 Python解析HTML页面
用 Python 解析 HTML 页面 在网络爬取的过程中,我们通常需要对所爬取的页面进行解析,从中提取我们需要的数据。网页的结构通常是由 HTML 标签所组成的,通过对这些标签的解析,可以得到网页中所包含的有用信息。在 Python 中&#…...