RocketMQ-存储与弹性伸缩

news2025/6/9 17:51:58

存储与弹性伸缩

  • 一、介绍
  • 二、存储架构图
    • 1.CommitLog
    • 2.ConsumeQueue
    • 3.IndexFile
  • 三、消息读写流程
    • 1.写入流程
      • 1.1 获取Topic元数据
      • 1.2 消息投递
      • 1.3 消息写入
    • 2.读取流程
      • 2.1 获取Topic元数据
      • 2.2 消息拉取
      • 2.3 消息消费
  • 四、消息持久化
    • 1.页缓存
    • 2.刷盘
      • 2.1 同步刷盘
      • 2.2 异步刷盘
  • 五、集群模式
    • 1.单Master模式
    • 2.多Master模式
    • 3.多Master多Slave模式-异步复制
    • 4.多Master多Slave模式-同步双写
  • 六、弹性伸缩
    • 1.NameServer
    • 2.Broker
      • 2.1 ConsumerQueue伸缩
      • 2.2 Broker伸缩
    • 3.Producer
    • 4.Consumer
  • 总结
  • 参考链接


一、介绍

主要是对RocketMQ的存储与弹性伸缩做一个学习和总结、加深印象。内容参考RocketMQ官方文档。

二、存储架构图

RocketMQ采用的是混合型存储结构,单个Broker实例将负责的所有队列用同一个日志数据文件(CommiLog)存储。
在这里插入图片描述

1.CommitLog

保存消息主体以及元数据,存储Producer端写入的消息主体内容。Broker负责的多个Topic的消息实体内容都存储于一个commitLog中。消息顺序写入commitLog文件,当文件满了,写入到下一个文件。

2.ConsumeQueue

消息消费队列类似kafka中的Topic下的分区,主要是为了提高消息消费的性能。针对主题消费不需要遍历commitLog文件并检索出对应topic消息。ConsumeQueue并不会保存消息主体内容,保存的主要是消息在CommitLog中的物理偏移量offset、消息的大小size、消息Tag的HashCode值。

3.IndexFile

提供一种可以通过key或者时间区间来查询消息的方法。

三、消息读写流程

1.写入流程

在这里插入图片描述

1.1 获取Topic元数据

  • 1.Producer与NameServer建立连接,发起获取Topic元数据请求
  • 2.Producer获取topic元数据信息

1.2 消息投递

  • 3.Producer根据元数据信息选择Broker和需要投递的队列
  • 4.Producer发起远程请求投递消息到Broker

1.3 消息写入

  • 5.Broker将消息写入到CommitLog文件
  • 6.ReputMessageService异步读取CommitLog信息
  • 7.ReputMessageService根据消息的topic和队列信息,将消息的offset、size、消息Tag的HashCode值写入到对应队列

2.读取流程

在这里插入图片描述

2.1 获取Topic元数据

  • 1.Consumer与NameServer建立连接,发起获取Topic元数据请求
  • 2.Consumer获取topic元数据信息

2.2 消息拉取

  • 3.Consumer根据元数据信息选择Broker和需要消费的队列
  • 4.Consumer发起远程消费请求到Broker

2.3 消息消费

  • 5.Broker根据上次Offset从消费队列查找消息检索信息
  • 6.Broker从CommitLog查询到消息主体,然后返回消息主体信息给Consumer

四、消息持久化

对于单个Broker的消息持久化,主要是需要知道OS对文件的缓存和刷盘机制。如果只选择单个机器模式,一旦Broker重启或宕机会导致服务不可用,Broker磁盘损坏也会导致消息丢失,所以需要选择适合的机器模式来解决单点故障。

1.页缓存

操作系统为了加速对文件的读写,采用了页缓存机制(PageCache)。对于数据的写入,OS会先将内容写入到Cache内,随后才会将Cache内的数据刷盘至物理磁盘上。对于数据的读取,如果一次读取文件时未命中PageCache,OS会从物理磁盘上读取文件并加载到PageCache。
RocketMQ采用混合存储,ConsumerQueue逻辑消费队列存储内容比较少,而CommitLog存储所有Topic信息主体,也就是文件数量不会随着Topic线性增长,可以充分利用页缓存机制来加快消息的消费和写入。

2.刷盘

消息发送到Broker后,是先写入到OS内存,然后将内存中数据刷盘到物理磁盘,才能保证消息不丢失。

2.1 同步刷盘

同步刷盘是指只有Broker将消息持久化到磁盘后,Broker端才会返回给Producer端一个ACK响应。同步刷盘对MQ消息可靠性来说是一种不错的保障。

2.2 异步刷盘

异步刷盘是指只要Broker将消息写入到PageCache,Broker端就会返回Producer端一个ACK响应。消息刷盘采用后台异步线程提交的方式进行,降低了读写延迟,提高了MQ的性能和吞吐量。

五、集群模式

1.单Master模式

单个Master一旦Broker重启或者宕机时,会导致服务不可用,不建议生产环境使用。

2.多Master模式

一个集群全是Master,配置简单,单个Maste宕机或重启对应用无影响。但是宕机机器在恢复之前,消息无法消费。

3.多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,采用异步复制方式,主备有短暂消息延迟(毫秒级)

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
  • 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

4.多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,采用同步双写方式,即只有主备都写成功,才向应用返回成功。

  • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
  • 缺点:性能比异步复制模式略低,发送单个消息的RT会略高

六、弹性伸缩

1.NameServer

通过HTTP服务来设置NameServer地址,可以支持动态增加NameServer。

2.Broker

2.1 ConsumerQueue伸缩

如果消息积压并且Consumer实例数量已经提升到与消息队列一致的情况下,可以通过同步增加ConsumerQueue与Consumer实例数量来减少消息的积压。增加ConsumerQueue后会触发所有Consumer实例的负载均衡。

2.2 Broker伸缩

如果Broker有性能瓶颈,可以通过新增Broker。在新的Broker进行新Topic创建或者已有Topic消费队列的创建来分担原有Broker的压力。

3.Producer

Producer发送消息的时候,默认会轮询消费队列进行消息发送。新增的Producer会从NameServer获取Topic的元数据从而选择对应的消费队列进行消息发送,删除的Producer不会有任何影响。

4.Consumer

在集群消费模式下,如果消费能力不足,可以通过增加消费组下的Consumer实例来增加消费能力。但是此模式下,每个消费队列只能由消费组下的一个Consumer实例来进行消费,也就是如果消费实例数量大于消费队列数量的消费实例不会进行消费,属于浪费资源。
消费组下的Consumer实例增加或者减少都会触发所有实例的负载均衡,将消费队列分配到对应的Consumer实例。

总结

RocketMQ采用的是混合存储,将Broker上的所有Topic信息主体保存到同一个文件中。特别适合内部消息队列的场景,即Topic数量多、但是每个Topic的消息量较少的场景。采用多种集群部署模式,可以适用多种可靠性场景。具有很强的弹性伸缩能力来满足业务波动的场景。


参考链接

1.RocketMQ存储架构
2.GitHub RocketMQ中文文档
3.Apache RocketMQ开发者指南
4.Apache RocketMQ 集群部署

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

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

相关文章

力扣199. 二叉树的右视图(DFS,BFS)

Problem: 199. 二叉树的右视图 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 无论是DFS还是BFS我们都要思考到达二叉树的每一层(或者每一层中的每一个节点)时,我们都该如何按题目要求做出对应得处理!!!在本体中我们主要是&#x…

为什么不用 index 做 key?

“在 Vue 中,我们在使用 v-for 渲染列表的时候,为什么要绑定一个 key?能不能用 index 做 key?” 在聊这个问题之前我们还得需要知道 Vue 是如何操作 DOM 结构的。 虚拟DOM 我们知道,Vue 不可以直接操作 DOM 结构&am…

使用docker部署redis集群

编写脚本 批量创建目录文件&#xff0c;编写配置文件 [rootlocalhost ~]# cat redis.sh #/bin/bash for port in $(seq 1 6); do mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >>/mydata/redis/node-…

吴恩达deeplearning.ai:倾斜数据集的误差指标精确率、召回率

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 倾斜数据集的误差指标罕见病预测精确率和召回率 精确率和召回率的权衡精确率和召回率的矛盾关系 F1算法 倾斜数据集的误差指标 在神经网络中&#xff0c;如果你的数据集中正例和负…

吉林大学 容斥原理 章节作业

作业题填空题解答题 作业题 填空题 聚会上&#xff0c;5位先生各自寄存自己的帽子。在返还时&#xff0c;有( )种方法使得至少有一位先生拿到的是自己原来的帽子。 【答案】76 计算多重集 S { 4 ⋅ a , 3 ⋅ b , 4 ⋅ c , 6 ⋅ d } S\{4 \cdot a, 3 \cdot b, 4 \cdot c, …

黑马点评-附近商户实现

GEO数据结构 Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;根据经纬度来检索数据。 GEO本质上是基于sortedSet实现的&#xff0c;在Sorted Set中&#xff0c;每个成员都是与一个分数(score)相关联的&#xff0c;这个分数用于对成员进行排序…

如何利用生成式人工智能助力短视频剧本创作?

短视频已成为现代人获取娱乐和信息的一种流行方式。不同于传统的电影和电视剧&#xff0c;短视频的时长通常较短&#xff0c;内容形式多样&#xff0c;更适合快节奏的社会生活。本文将讨论如何编写短视频剧本&#xff0c;以及它与传统故事在结构和内容上的区别。 简介 短视频剧…

测试工具使用技巧01-->jmeter链接mysql

前言 在做接口或者性能测试的时候&#xff0c;有时需要jmeter连接数据库做操作&#xff0c;可以看看如下实例。操作实例 在mysql数据库中有如下数据表 在jmeter导入jdbc驱动插件&#xff08;需要的留言找我拿&#xff09; 在jmeter测试计划元件最下面&#xff0c;导入jdbc.…

Unity的PICO项目基础环境搭建笔记(调试与构建应用篇)

文章目录 前言一、为设备开启开发者模式1、开启PICO VR一体机。前往设置>通用>关于本机>软件版本号2、一直点击 软件版本号 &#xff0c;直到出现 开发者 选项3、进入 开发者模式&#xff0c;打开 USB调试&#xff0c;选择 文件传输 二、实时预览应用场景1、下载PC端的…

使用 Python 读取 NetCDF 数据

栅格通用数据格式(NetCDF)通常用于存储多维地理数据。这些数据的一些示例包括温度、降水量和风速。NetCDF 中存储的变量通常每天在大片(大陆)区域进行多次测量。由于每天进行多次测量,数据值会快速积累并且变得难以处理。当每个值还分配给一个地理位置时,数据管理会更加复…

tcp流式服务和粘包问题

目录 1.概念 2.流式服务 3.粘包问题 1.概念 套接字是一个全双工的 使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输. TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成…

什么是数据采集与监视控制系统(SCADA)?

SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机&#xff0c;以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据&#xff0c;例如温度、压力、流量等&#xff0c;然后将这些数据汇…

git讲本地代码提交到码云https://gitee.com/

首先需要在码云中自己账号下创建一个空的仓库 第一步 如下图 第二步 仓库名字和仓库是否私有&#xff0c;其他不用选 以上操作好了以后 回到本地&#xff0c;在本地你要上传到仓库的项目路径下&#xff0c;初始化为git 执行 git init 接着&#xff0c;把远程仓库地址复制下…

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——03.差异表达基因筛选(2)

内容如下&#xff1a; 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的…

STL之deque容器代码详解

1 基础概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作。 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低。 deque相对而言&#xff0c;对头部的插入删除速度回比vector快。 vector访问…

猫头虎分享已解决Bug || 云服务中断:CloudOutage, CloudProviderError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

HashMap构造函数

HashMap() /*** Constructs an empty <tt>HashMap</tt> with the default initial capacity* (16) and the default load factor (0.75).* 这是一个默认的构造方法&#xff0c;初始化的容量大小是16&#xff0c;装填因子是0.75* a 装填因子* n 关键字个数* m 总容…

Linux随记(八)

一、crontab运行shell脚本&#xff0c;py脚本 &#xff08;注意事项&#xff09; 情景描述&#xff1a; 目前有个sh脚本他最初大致内容是。 cat t11.sh#!/bin/bash source /etc/profile /bin/python3 /tmp/1.py sh /tmp/1.sh echo -e "$(date %F)" >…

C语言指针、数组学习记录

指针 指针是什么 数据在内存中存放的方式 声明一个变量int i 3;&#xff0c;那么在内存中就会分配一个大小为4字节&#xff08;因为int类型占4字节&#xff09;的内存空间给变量i&#xff0c;这块内存空间存放的数据就是变量i的值。 换句话说就是&#xff0c;在内存中给变…

MySQL--优化(索引)

MySQL–优化&#xff08;索引篇&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 索引 索引&#xff08;index&#xff09;是帮助 MySQL 高效获取数据的数据结构&#xff08;有序&#xff09;。在数据…