图解 RocketMQ 架构

写在前面

Kafka、RocketMQ都是很出名的中间件,上次我们讲解了Kafka,这次我们来讲讲RocketMQ的原理。

基本架构图

在这里插入图片描述

解析

RocketMQ 总共可以分成四个模块

  • NameServer:提供服务发现和路由功能,管理各种元数据信息。
  • Broker:消息存储和路由分发节点,负责存储消息和将消息路由给消费者。
  • Producer:消息生产者,负责产生并发送消息到指定的 Topic
  • Consumer:消息消费者,订阅 Topic 并从 Broker 拉取消息进行处理。
    在这里插入图片描述

大体读写步骤

  1. 注册 Broker Cluster 到 NameServer。
  2. 注册 Producer、Consumer 到 NameServer。
  3. Producer 获取MQ集群的Broker、Queue等信息。
  4. Producer 发消息,一般消息都会选择master进行写入,而slave进行读取。
  5. 顺序写入消息到 commit log 中。
  6. queue log会记录每条commit log的存储信息,当然不会记录所有,只记录一些重要的,commitLogOffset等等。
  7. master 将消息异步给slave。
  8. Consumer读取slave的消息。
  9. Consumer返回ACK作为确认消息消费成功。

1. NameServer

当Broker服务启动后,会向NameServer注册信息,比如broker中的Topic、消费偏移量、队列、ip、端口等,由Broker的心跳发送到NameServer,BrokerCluster 中的每一个节点都会注册到NameServer上。
在这里插入图片描述
即使一个NameService节点挂了,剩下的一个NameService节点仍然包含所有的broker信息。不过NameService是无状态的, NameService之间不会相互通信,那么一个NameService挂了,不会影响另外一个NameService。

注册完Broker之后,NameServer会每隔10s发送心跳检查Broker,如果Broker超过120s还没有相应,则这个Broker被视为宕机

2. Broker

2.1 CommitLog & Message Queue

Broker 启动,跟所有的 NameServer 保持长连接,每 30s 发送一次发送心跳包(像心跳一样持续稳定的发送请求)。心跳包中包含当前 Broker 信息 ( IP+ 端口等)以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic 跟 Broker 的映射关系。

在这里插入图片描述
Broker接受消息,会顺序写入消息到 CommitLog 中。Broker里面的两个存储介质:Commit log 和 Message queue的区别:

  1. Commit log 存储消息实体。顺序写,随机读。虽然是随机读,但是利用package机制,可以批量地从磁盘读取,作为cache存到内存中,加速后续的读取速度。
  2. Message queue 存储消息的偏移量。读消息先读 message queue,根据偏移量到 commit log 读消息本身。

所以其实我们的消息不是存放在queue中,而是存放在commit log中,这就是为什么queue会被称为逻辑队列

2.2 Index File

2.2.1 介绍

因为所有的消息都存在CommitLog中,如果要实现根据 key 查询 消息的方法,就会变得非常困难,所以为了解决这种业务需求,有了IndexFile的存在。用于为生成的索引文件提供访问服务,通过消息 Key 值查询消息真正的实体内容。

IndexFile 如何创建?以创建的时间戳命名。参数:phyOffset物理偏移量(也就是commitLogOffset)、keys。

在这里插入图片描述
如何查询消息呢?

2.2.2 按照MessageId查询

RocketMQ中的MessageId的长度总共有16字节,其中包含了消息存储主机地址(IP地址和端口),消息Commit Log offset。

  1. Client 端从 MessageId 中解析出 Broker 的地址(IP地址和端口)和Commit Log的偏移地址发送一个RPC请求。
  2. Broker 端读取消息的过程用其中的 commitLog offset 和 size 去 commitLog 中找到真正的记录并解析成一个完整的消息返回。

在这里插入图片描述

2.2.3 按照Message Key查询
  1. 找槽位:slotKey = 40 byte + hash(topic + "#" + key) % 500W * 4byte
  2. 计算槽位:slotValue = 最新插入 index 的位置。
  3. 遍历单向链表:从 slotValue 找到最新 index 在整个索引文件中位置 = 40byte +500w*4byte + slotValue*20byte,然后根据单个索引文件的 pre index 值找到前一个索引,一直遍历下去,直到index数据中key hash和时间区间都满足即可。添加到 commitLogOffset 的 list) 中。
  4. 最终根据其中的 commitLogOffset 从 CommitLog 文件中读取消息的实体内容。

3. Producer

略。Producer好像除了负载均衡,就没什么好讲的地方了。

4. Consumer

在RocketMQ中,Consumer端的两种消费模式(Push/Pull)都是基于拉模式来获取消息的,pull需要手动实现拉取消息,push只需要实现消费监听器。但实际底层都是pull。

在Consumer启动后,会通过定时任务不断地向所有Broker实例发送心跳包,包含:消息消费分组名称、订阅关系集合、消息通信模式和客户端id的值等信息

Broker端在收到Consumer的心跳消息后,会将它维护在 ConsumerManager 的本地缓存变量。会根据消费者组获取对应维护的消费者组信息。

在这里插入图片描述

如果是新加入的consumer获取订阅信息变了,会通知这个消费者组里面的其他消费者说消费者有变化,被通知到的消费者就会重新负载均衡
在这里插入图片描述

在这里插入图片描述

参考

[1] https://www.modb.pro/db/141171
[2] https://www.cnblogs.com/duanxz/p/5020398.html
[3] https://www.cnblogs.com/dennyzhangdd/p/15035116.html
[4] https://www.alibabacloud.com/blog/rocketmq-5-0-architecture-analysis-how-to-support-diversified-scenarios-based-on-cloud-native-architecture_600564
[5] https://cloud.tencent.com/developer/article/2277381
[6] https://www.cnblogs.com/hzzjj/p/16552514.html

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

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

相关文章

基于最大相邻夹角的边缘点提取(matlab)

1、背景介绍 边缘点是指点云数据中代表物体或场景几何形状突变的那些点。在三维点云中,边缘点通常标志着不同表面或物体的分界,或者是物体表面上的不规则性,如裂缝、棱角、突起等。点云边缘检测的作用非常重要,最常见是进行特征点…

php校园二手交易网站-计算机毕业设计源码041148

目 录 摘要 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2 校园二手交易网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结…

AI学习指南机器学习篇-K均值聚类聚类数目选择

AI学习指南机器学习篇-K均值聚类聚类数目选择 在机器学习领域,K均值聚类是一种常用的无监督学习方法,用于将数据集分成K个类别。然而,选择适当的聚类数目K是一个常见的问题,因为不恰当的聚类数目选择可能导致聚类结果不理想。本文…

nginx配置代理

nginx配置代理 1. 安装并启动Nginx:2. 加载Nginx配置文件:3. 创建虚拟主机配置文件:4. 创建符号链接以启用虚拟主机:5. 检查配置文件语法是否正确:6. 重新加载Nginx配置:7. 配置反向代理:8. 高级…

MySQL安全加固

安全加固 禁止MySQL以管理员的身份账号权限运行 #用普通账户运行mysqld#加固方法: my.cnf配置文件中配置usermysql是否存在密码为空的用户 #1、sql_mode启用 NO_CREATE_AUTO_USER,这个参数(NO_CREATE_AUTO_USER)禁止自动创建密…

基于AOP的数据字典实现:实现前端下拉框的可配置更新

作者:后端小肥肠 创作不易,未经允许严禁转载。 目录 1. 前言 2. 数据字典 2.1. 数据字典简介 2.2. 数据字典如何管理各模块的下拉框 3. 数据字典核心内容解读 3.1. 表结构 3.2. 核心代码 3.2.1. 根据实体类名称获取下属数据字典 3.2.2. 数据字…

回顾 DTC 2024 大会——聚焦数据技术创新:揭秘下一代纯实时搜索引擎 INFINI Pizza

2024 年 4 月 12 日至 13 日,备受瞩目的第十三届“数据技术嘉年华”(DTC2024)在北京新云南皇冠假日酒店盛大开幕。本次大会由中国 DBA 联盟(ACDU)与墨天轮社区联合主办,以“智能云原生一体化——DB 与 AI 协…

在先企业字号被申请注册成商标!

今天一网友联系普推商标知产老杨,说自己注册的商标被某公司无效宣告了,去年联系老杨时,当时就给说这个商标名称存在风险,与别人的字号权存在高度近似,而且是同行业同地区在后面注册的。 十几年前某公司先成功注册成字号…

Ubuntu 安装CGAL

一、什么是CGAL CGAL(Computational Geometry Algorithms Library)是一个广泛使用的开源库,主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构,适用于各种应用领域。以下是 CGAL 的主要功能…

postcss-pxtorem

postcss-pxtorem屏幕自适应 //安装插件 npm install postcss postcss-pxtorem --save-dev//在根目录中新增postcss.config.cjs或postcss.config.js文件,并写上如下代码 module.exports {plugins: {"postcss-pxtorem": {rootValue: 16,selectorBlackList…

如何利用Java Stream API简化集合操作?

如何利用Java Stream API简化集合操作? 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! Java Stream API是Java 8引入的一种新的抽象概念,用于对集合对象进行函数式风格的操作…

算力共享和联邦学习的关系

目录 算力 共享和联邦学习的关系 算力共享 联邦学习 算力共享与联邦学习的关系 算力 共享和联邦学习的关系 算力共享和联邦学习之间存在着紧密的关系,它们都是现代数据处理和机器学习领域中的重要概念,尤其在处理大规模数据和保护数据隐私方面发挥着关键作用。 算力共享…

JD-GUI下载和使用

JD-GUI是专门查看jar包的,包括source.jar和doc.jar。JD-GUI可以把.class文件反编译为可编辑的.java文件,有图形化界面。 github下载地址:https://github.com/java-decompiler/jd-gui/releases 下载windows版本的zip包,如下图&…

智能化代码审查系统设计

设计一个智能化代码审查系统,特别是针对Java开发,需要综合考虑多个维度来提升代码质量、提高审查效率,并促进团队间的协作。以下是该系统设计的关键要素和功能特性: 系统架构 客户端-服务器架构:前端提供友好的Web界面…

2477. 到达首都的最少油耗

Problem: 2477. 到达首都的最少油耗 文章目录 思路解题过程复杂度Code 思路 为了解决这个问题,我们使用深度优先搜索(DFS)算法来遍历给定的树形结构。在这个过程中,我们维护两个数组,size 和 cost,分别用于…

破局 AI 2.0 时代:利用 AI 提升自我核心竞争力

文章目录 破局 AI 2.0 时代:利用 AI 提升自我核心竞争力1. AI 2.0 时代1.1 特点1.2 发展1.3 影响 2. AI 2.0 时代的机遇 & 挑战2.1 AI 对行业市场的冲击2.2 挑战变为机遇2.3 不同场景下的 AI 效能提升2.3.1 自动化办公任务2.3.2 提升学习效率2.3.3 创意生成与内…

Golang 网络编程socket+tcp+udp

Part 26 - 网络编程 网络编程分类 基于 TCP/IP 的 Socket编程基于 HTTP 的 HTTP 编程 端口 0是保留端口1-1024是知名端口 21:ftp22:ssh23:telnet24:smtp80:http 1025-65535是动态端口 Socket 的使用流程 服务端 监…

LabVIEW光谱测试系统

在现代光通信系统中,光谱分析是不可或缺的工具。开发了一种基于LabVIEW的高分辨率光谱测试系统,通过对可调谐激光器、可编程光滤波器和数据采集系统的控制,实现了高效、高精度的光谱测量。 项目背景 随着光通信技术的迅速发展,对…

仿哔哩哔哩视频app小程序模板源码

仿哔哩哔哩视频app小程序模板源码 粉色的哔哩哔哩手机视频网页,多媒体视频类微信小程序ui前端模板下载。包含:视频主页和播放详情页。 仿哔哩哔哩视频app小程序模板源码

thinkphp6/8 验证码

html和后台验证代码按官方来操作 ThinkPHP官方手册 注意: 如果验证一直失败,看看Session是否开启, 打印dump(session_status());结果2为正确的, PHP_SESSION_DISABLED: Session功能被禁用(返回值为0)。…