《RockectMQ实战与原理解析》Chapter4-分布式消息队列的协调者

news2024/10/7 4:32:49

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 。

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

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

相关文章

基于OBS超低延迟直播实测(400毫秒左右)超多组图

阿酷TONY&#xff0c;原创文章&#xff0c;长沙。 文章简述&#xff1a;本文介绍使用OBS无延迟直播插件在第三方云平台&#xff0c;如何实现超低延时直播的完整教程&#xff08;延迟约为400毫秒左右&#xff0c;通常延迟是3-15秒&#xff09;。 OBS简要介绍 OBS&#xff08;O…

vue3+vite3+typescript实现验证码功能及表单验证

文章目录验证码组件父组件表单验证最终效果验证码组件 <template><div class"captcha" style"display: flex;"><canvas ref"canvas" width"100" height"40"></canvas></div><div class&qu…

LeetCode 1019. Next Greater Node In Linked List【单调栈模板】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

如何实现视觉识别颜色

1. 功能说明 通过摄像头识别特定颜色&#xff08;红、绿、蓝&#xff09;。摄像头采集图像信息并通过WiFi将信息传递给PC端&#xff0c;然后PC端根据比例判断出目标颜色在色盘上的所属颜色后&#xff0c;指针便会指向对应颜色。 红、绿、蓝-色块2. 电子硬件 本实验中采用了以下…

网络编程【TCP流套接字编程】

目录 TCP流套接字编程 1.ServerSocket API 2.Socket API 3.TCP中的长短连接 4.回显程序(短连接) 5.服务器和客户端它们的交互过程 6.运行结果及修改代码 TCP流套接字编程 ❗❗两个核心&#xff1a;ServerSocket Socket 1.ServerSocket API ✨ServerSocket 是创建…

RK3568平台开发系列讲解(Linux系统篇)Linux 目录结构介绍

🚀返回专栏总目录 文章目录 一、 linux 目录结构二、 linux 文件层次标准三、 linux 目录结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们从目录管理入手,会更直观的理解 linux 的目录结构。 一、 linux 目录结构 Linux 整个文件系统是以“ / ”目录开…

Cobalt_Strike_4.5渗透工具的安装与使用

前言&#xff1a; Cobalt Strike是一款内网渗透测试神器&#xff0c;Cobalt Strike分为客户端和服务器端&#xff0c;该服务器端被称为团队服务器&#xff0c;是Beacon有效负载的控制器&#xff0c;同时&#xff0c;cobalt strike也具有社会工程学功能&#xff0c;团队服务器还…

企业如何使用OA系统?OA系统有哪些功能和应用的场景?

企业如何使用OA系统&#xff1f;OA系统有哪些功能和应用的场景&#xff1f; 办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化技术运用到传统办公方式&#xff0c;进而形成的一种新型办公方式。办公自动化利用现代…

02_Uboot基本命令与内存命令

目录 U-Boot命令使用 信息查询命令 环境变量操作命令 内存操作命令 U-Boot命令使用 进入uboot的命令行模式以后输入“help”或者“&#xff1f;”,然后按下回车即可查看当前uboot 所支持的命令,如图所示: 图中只是uboot的一部分命令,具体的命令列表以实际为准。图中的命令…

Mongo初遇回忆录

序 上周&#xff0c;我和M女士分手了&#xff0c;也许是上个月&#xff0c;我不知道。也许是她太墨守成规&#xff0c;也许是我太肆意妄为&#xff0c;她说我给不了她想要的平稳和安定。她没有留下太多东西&#xff0c;我也不愿留下更多回忆。 做决定的过程中&#xff0c;我比…

「计算机控制系统」4. 计算机控制系统分析

Z平面 稳定性分析 稳态误差分析 动态过程分析 频率特性 文章目录Z平面与S平面的映射关系稳定性分析离散Routh判据Jury判据离散Nyquist判据稳态误差静态误差系数动态过程频率特性Z平面与S平面的映射关系 S平面虚轴的映射 ω\omegaω与θ\thetaθ的映射 可以看出从S平面到Z平面…

远程组态管理的好处

远程组态管理可以简化管理工作&#xff0c;帮助您节省时间和金钱。远程组态管理可以通过各种应用程序来实现&#xff0c;包括&#xff1a; •监控所有设备的状态&#xff0c;以确保它们正常工作。 •记录现场数据&#xff0c;例如温度&#xff0c;压力或流量。 •快速、轻松地…

自动驾驶「时过境迁」,这家头部出行服务平台再出发

滴滴自动驾驶复活了&#xff1f; 昨日&#xff0c;滴滴正式发布了首个自动驾驶自动运维中心&#xff0c;以及首款未来服务概念车DiDi Neuron&#xff0c;同时还公布了在技术、硬件、量产以及新业务探索方面的进展。 按照计划&#xff0c;滴滴自动驾驶正在结合新能源整车企业能…

【单链表】的增删查改

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : “Onc in a blu moon” : “罕见的,千载难逢的” (出现在19世纪,指的是"在一个月内出现的第二次圆月”&#xff0c;这种现象每隔32个月发生一次。) 文章目录✔单链表的功能实现:&…

大前端突围之路:从RN跨平台到大前端全栈统一

本文首发自「慕课网」(imooc.com)&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;FE大公爵|慕课网讲师 前言 不知不觉&#xff0c;在大前端领域也混迹十年了&#xff0c;一路的经历不敢说…

接口自动化测试yaml+requests+allure技术,你学会了吗?

目录 前言 一、什么是接口自动化测试 二、为什么要进行接口自动化测试 三、接口自动化测试的流程 四、yaml语言介绍 五、requests库介绍 六、allure技术介绍 七、总结 前言 接口自动化测试是在软件开发过程中常用的一种测试方式&#xff0c;通过对接口进行自动化测试&a…

SQL Sever 单表数据查询(下)

提示&#xff1a;本篇文章是在上篇文章的基础上进行单表数据查询操作的补充,主要以例题的方式呈现. 文章目录前言1.分组&#xff1a;统计各门课程的选修人数2.分别统计男女生的平均年龄3.查询所有科目成绩在85分以上的学生的学号及其平均分4.查询平均年龄大于18岁的系部和平均年…

Linux复习 / 动静态库QA梳理 | 如何使用第三方库?

文章目录前言Q&A概念Q&#xff1a;使用静态库和使用动态库的程序有什么区别&#xff1f;Q&#xff1a;什么是静态链接/动态链接&#xff1f;使用与制作Q&#xff1a;如何制作动静态库&#xff1f;Q&#xff1a;如何使用第三方库&#xff1f;Q&#xff1a;程序加载时&#x…

C语言-实现顺序二叉树和平衡二叉树AVL

1. 结构体 在实现二叉树之前先看下结构体的一些使用方法 数组是保存一系列相同的数据。在实际问题中&#xff0c;一组数据往往有很多种不同的数据类型。例如&#xff0c;登记学生的信息&#xff0c;可能需要用到 char型的姓名&#xff0c;int型或 char型的学号&#xff0c;in…

4.6--计算机网络之TCP篇之TCP的基本认识--(复习+深入)---好好沉淀,加油呀

1.TCP 头格式有哪些&#xff1f; 序列号&#xff1a; 在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。 用来解决网络包乱序问题。 确认应答号&#xff1a; …