当前位置: 首页 > news >正文

《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 是整个消息队列中的状态服务器&#xff0c;集群的各个组件通过它来了解全局的信息 。 同时&#xff0c;各个角色的机器都要定期向 NameServer 上报自己的状态&#xff0c;超时不上报的话&#xff0c; NameServer 会认为某个机器出故障不可用了…...

Spring Boot 最适配的 UI 是什么

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

TensorFlow 1.x 深度学习秘籍:6~10

原文&#xff1a;TensorFlow 1.x Deep Learning Cookbook 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如…...

分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?

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

RK3399平台开发系列讲解(基础篇)POSIX 定时器

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

web小游戏开发:扫雷(三)(完成度90%)

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

创建菜单栏、菜单、菜单项

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

专访丨AWS量子网络中心科学家Antía Lamas谈量子计算

​ Anta Lamas Linares&#xff08;图片来源&#xff1a;网络&#xff09; 47岁的Anta Lamas Linares出生于西班牙西北部的圣地亚哥德孔波斯特拉。她在当地学习物理学&#xff0c;然后在牛津大学和加利福尼亚继续深造。后来&#xff0c;她在新加坡领导了亚马逊网络服务&#xf…...

[ 云计算 | Azure ] Chapter 04 | 核心体系结构之数据中心、区域与区域对、可用区和地理区域

本章节主要内容进行讲解&#xff1a;Azure云计算的核心体系结构组件中的&#xff1a;Azure物理基础设施&#xff08;Physical infrastructure&#xff09;&#xff0c;区域&#xff08;Regions&#xff09;和区域对&#xff08;Region Pairs&#xff09;、地理数据中心&#xf…...

升级长江存储最新闪存,忆恒创源发布新一代企业级NVMe SSD

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

Xcode14:”Failed to prepare the device for development“解决

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

程序员的“灵魂笔记本“:五款高效笔记软件推荐

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

Linux基础命令-scp远程复制文件

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

【python学习】基础篇-列表元素排序操作 sort()、min()、max()函数

列表对象中提供了 sort0 方法&#xff0c;该方法用于对原列表中的元素进行排序&#xff0c;排序后原列表中的元素顺序将发生改变。 其语法格式如下: listname.sort(keyNone&#xff0c; reverseFalse) key&#xff1a;用于比较的键 reverse&#xff1a;可选参数&#xff0c;Fal…...

机器视觉检测系统的基本流程你知道吗

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

【vue】Vue 开发技巧:

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

Kubebuilder Hello World

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

SpringSecurity之权限方案——用户认证

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

本地电脑轻松部署GPT4(无需账号)!

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

每天一道大厂SQL题【Day21】华泰证券真题实战(三)

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

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...