RocketMQ消息是如何储存的?

前言

之前有写过关于kafka的存储结构的文章。RocketMQ大部分是借鉴了Kafka的设计原理,但是副本集群机制和存储结构有些差异。看完本篇文章可以看看这篇。消息中间件之kafka
RocketMQ 的消息存储机制是其高吞吐、高可用和高可靠性的关键。以下将介绍 RocketMQ 消息存储的核心机制

1. 存储架构

RocketMQ 的消息存储主要由以下部分组成:

  • CommitLog: 所有消息都顺序写入 CommitLog 文件,保证高吞吐。
  • ConsumeQueue: 每个消息队列(Topic+Queue)对应一个 ConsumeQueue,存储消息在 CommitLog 中的偏移量,方便快速检索。
  • IndexFile: 提供基于消息 Key 或时间范围的查询功能。

2. CommitLog

  • 顺序写入: 所有消息按顺序追加到 CommitLog 文件,提升写入性能。
  • 文件大小固定: 每个 CommitLog 文件默认 1GB,写满后创建新文件。
  • 异步刷盘: 支持同步和异步刷盘,异步刷盘通过批量写入提升性能,同步刷盘则保证数据不丢失。

3. ConsumeQueue

  • 消息索引: 存储消息在 CommitLog 中的物理偏移量、大小和 Tag 哈希值,方便快速定位消息。
  • 文件分段: 每个 ConsumeQueue 文件默认存储 30万条索引,文件大小固定。
  • 异步构建: ConsumeQueue 通过异步方式从 CommitLog 构建,不影响主写入流程。

4. IndexFile

  • 索引服务: 提供基于消息 Key 或时间范围的查询,文件大小固定(默认 400MB)。

  • 哈希索引: 通过哈希索引快速定位消息位置。

  • 在这里插入图片描述

5. 消息存储流程

  1. 消息写入: 生产者发送消息,Broker 将其顺序写入 CommitLog。
  2. 构建索引: 异步构建 ConsumeQueue 和 IndexFile。
  3. 消息读取: 消费者通过 ConsumeQueue 找到消息在 CommitLog 中的位置,读取消息。

6. 刷盘机制

  • 同步刷盘: 消息写入 CommitLog 后立即刷盘,保证数据不丢失,但性能较低。
  • 异步刷盘: 消息写入 CommitLog 后先存入 PageCache,由操作系统异步刷盘,性能较高,但可能丢失部分数据。

7. 文件清理

  • 过期清理: 定期清理过期消息(默认 72 小时)。
  • 文件删除: 根据磁盘使用情况删除旧的 CommitLog 文件。

8. 高可用性

  • 主从复制: Broker 支持主从架构,主节点将消息同步到从节点,主节点故障时从节点可继续提供服务。
  • 数据冗余: 通过多副本机制保证数据不丢失。

9. 性能优化

  • 零拷贝: 通过 mmapsendfile 技术减少数据拷贝,提升性能。
  • 批量写入: 支持批量消息写入,减少 IO 操作。

总结

RocketMQ 通过 CommitLog 顺序写入、ConsumeQueue 索引、IndexFile 查询等机制实现高效的消息存储和检索,并通过同步/异步刷盘、主从复制等技术保证高可用性和可靠性。

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

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

相关文章

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Coze扣子怎么使用更强大doubao1.5模型

最近,豆包刚刚发布了最新的doubao1.5系列模型,并且加量不加价。 在性能极大进步的情况下,价格还与之前一致。真是业界良心了。 在同样的价格下,肯定要使用性能更强大的模型嘛 于是我准备把所有的智能体和工作流切换到doubao1.5…

UEditorPlus v4.3.0 已知问题修复,表格自适应,全屏编辑优化

UEditor 是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更…

【核心算法篇十四】《深度解密DeepSeek量子机器学习:VQE算法加速的黑科技与工程实践》

在经典计算机逼近物理极限的今天,量子计算正以指数级加速潜力颠覆传统计算范式。想象一下,一个需要超级计算机运算千年的化学分子模拟问题,用量子计算机可能只需几分钟——这就是DeepSeek团队在VQE(Variational Quantum Eigensolver)算法加速实践中创造的奇迹。根据,VQE作…

Hackthebox- Season7- Titanic 简记 [Easy]

简记 ip重定向到 http://titanic.htb,先添加hosts 收集子域名 wfuzz -c -u http://titanic.htb/ -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -H Host:FUZZ.titanic.htb --hl 9 ******************************************************** * Wfu…

【C语言】C语言 哈夫曼编码传输(源码+数据文件)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 C语言 哈夫曼编码传输(源码数据文件&am…

撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法

问题:控件重叠 分析原因:因为设置了最小大小,所以界面中的大小不会随窗口的变化而自动变化。 处理方案:修改mimumSize的宽度与高度为0,并设置sizePolicy为Expanding,让其自动伸缩。 结果展示(自…

Leetcode - 周赛436

目录 一、3446. 按对角线进行矩阵排序二、3447. 将元素分配给有约束条件的组三、3448. 统计可以被最后一个数位整除的子字符串数目四、3449. 最大化游戏分数的最小值 一、3446. 按对角线进行矩阵排序 题目链接 本题可以暴力枚举,在确定了每一个对角线的第一个元素…

玩转SpringCloud Stream

背景及痛点 现如今消息中间件(MQ)在互联网项目中被广泛的应用,特别是大数据行业应用的特别的多,现在市面上也流行这多个消息中间件框架,比如ActiveMQ、RabbitMQ、RocketMQ、Kafka等,这些消息中间件各有各的优劣,但是想…

解决 Mac 只显示文件大小,不显示目录大小

前言 在使用 mac 的时候总是只显示文件的大小,不显示文件夹的大小,为了解决问题可以开启“计算文件夹”。 步骤 1.进入访达 2.工具栏点击“显示”选项,点击 “查看显示选项” 3.勾选 显示“资源库"文件夹 和 计算所有大小 或者点击…

STM32 定时器产生定周期方法

目录 背景 程序 第一步、使能PCLK1外设时钟​编辑 第二步、时基单元配置 第三步、配置NVIC(设置定时中断优先级)​编辑 第四步、使能溢出中断 第五步、使能定时器 第六步、填写中断处理函数(ISR) 背景 在单片机开发当中&…

【DeepSeek系列】04 DeepSeek-R1:带有冷启动的强化学习

文章目录 1、简介2、主要改进点3、两个重要观点4、四阶段后训练详细步骤4.1 冷启动4.2 推理导向的强化学习4.3 拒绝采样和有监督微调4.4 针对所有场景的强化学习 5、蒸馏与强化学习对比6、评估6.1 DeepSeek-R1 评估6.2 蒸馏模型评估 7、结论8、局限性与未来方向 1、简介 DeepS…

Compose常用UI组件

Compose常用UI组件 概述Modifier 修饰符常用Modifier修饰符作用域限定Modifier Modifier 实现原理Modifier.Element链的构建链的解析 常用基础组件文字组件图片组件按钮组件选择器对话框进度条 常用布局组件线性布局帧布局 列表组件 概述 Compose 预置了很多基础组件&#xff…

Ansys EMC Plus:HIRF 与飞机耦合演示

在本篇博文中,我们将深入探讨 EMC Plus 高强度辐射场 (HIRF) 与软件示例中提供的飞机演示的耦合。本概述将指导您完成整个工作流程,从设置问题空间到基本后处理,包括材料属性分配和创建探针。 概述 在本演示中,下图所示的预先简化…

DeepSeek + Mermaid编辑器——常规绘图

下面这张图出自:由清华大学出品的 《DeepSeek:从入门到精通》。 作为纯文本生成模型,DeepSeek虽不具备多媒体内容生成接口,但其开放式架构允许通过API接口与图像合成引擎、数据可视化工具等第三方系统进行协同工作,最终…

红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测

文章目录 ​​研判(入侵检测)​​ ​​设备​​ ​​经典网络​​​​云网络​​ ​​异常HTTP请求​​​​Webshell分析​​ ​​Webshell 的分类​​​​Webshell 的检测​​ ​​主机层面​​​​流量层面​​ ​​附录​​ ​​常见端口漏洞…

基于levmar(Levenberg-Marquardt 非线性最小二乘优化库)的椭圆拟合

1. 包含必要的头文件 #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <vector> #include <cmath>2. 定义生成椭圆点的函数 编写一个函数&#xff0c;接受椭圆的中心坐标、长轴半径、短…

Fastgpt学习(5)- FastGPT 私有化部署问题解决

1.☺ 问题描述&#xff1a; Windows系统&#xff0c;本地私有化部署&#xff0c;postgresql数据库镜像日志持续报错" data directory “/var/lib/postgresql/data” has invalid permissions "&#xff0c;“ DETAIL: Permissions should be urwx (0700) or urwx,gr…

基于SpringBoot+vue粮油商城小程序系统

粮油商城小程序为用户提供方便快捷的在线购物体验&#xff0c;包括大米、面粉、食用油、调味品等各种粮油产品的选购&#xff0c;用户可以浏览商品详情、对比价格、下单支付等操作。同时&#xff0c;商城还提供优惠活动、积分兑换等福利&#xff0c;让用户享受到更多实惠和便利…

Python编程之数据分组

有哪些方式可以进行数据分组利用Pandas库进行分组使用itertools库的groupby分组操作构建Python字典方式实现(小规模数据,不适用数量特别大的情况,不需要依赖其它python库)利用NumPy的groupby函数分组操作利用Python的Dask库提供的函数进行分组下面看一个如何去实现坐标数据…