RocketMQ的消息存储是一个复杂而高效的过程,设计上充分考虑了性能和扩展性,

消息存储的主要组件包括CommitLog文件、消费队列文件(ConsumerQueue)、以及索引文件(IndexFile)

一、CommitLog文件

CommitLog是Rocketmq的核心存储文件,负责保持消息的完整内容

  • 顺序写入:所有的消息都是顺序写入CommitLog文件,这种方式减少了磁盘寻道时间,提高了写入性能

  • 文件滚动:CommitLog按照固定大小(比如1GB)进行分片。当一个文件写满后,会创建一个新的文件

  • 存储所有数据:包括消息体、主题、队列ID等

  • 刷盘策略:

    • 同步刷盘(SYNC_FLUSH):消息写入磁盘后才返回 ACK,可靠性高但性能较低

    • 异步刷盘(ASYNC_FLUSH):消息写入 PageCache 后立即返回 ACK,由后台线程定期刷盘(默认策略)

二、ConsumerQueue

ConsumerQueue是针对消息的逻辑图,指在加快消费者对消息的快速定位

  • 异步分发:后台线程 ReputMessageService 定时从 CommitLog 提取消息,按 Topic 和 Queue 分发到对应的 ConsumeQueue

  • 索引结构:每个 ConsumeQueue 条目固定 20 字节,包含:

     | CommitLog Offset (8B) | Size (4B) | Message Tag Hash (8B) |
    
     通过 CommitLog Offset 和 Size 可快速定位消息在 CommitLog 中的位置

三、可选,构建 IndexFile

  • 哈希索引:根据消息的 Key 或 Tag 构建哈希索引(IndexFile),支持按消息 Key 查询(如事务消息回查)

四、消息读取流程(消费过程)

1、消费者拉取消息:

  • 根据 Topic 和 Queue ID 找到对应的 ConsumeQueue

  • 从 ConsumeQueue 中读取条目,获取消息在 CommitLog 的物理偏移量(Offset)和 Size

2、定位 CommitLog:

  • 根据 CommitLog Offset 和 Size,直接从 CommitLog 文件读取完整消息内容

五、存储优化机制

1、页缓存(PageCache)加速

  • RocketMQ 利用 Linux 的 PageCache 机制,优先读写内存缓存,大幅减少磁盘 IO

  • 建议:Broker 机器预留 50% 内存供 PageCache 使用

2、文件预分配

  • CommitLog 和 ConsumeQueue 文件预先分配固定大小(如 1GB),避免动态扩容带来的性能抖动

3、过期文件清理

  • 默认保留 72 小时消息,可通过配置调整:

后台线程定期删除过期文件,释放磁盘空间

六、高可用设计

1、主从同步(Replication)

  • 同步复制(SYNC_MASTER):Master 需等待 Slave 存储成功后才返回 ACK,确保数据不丢失

  • 异步复制(ASYNC_MASTER):Master 写入后立即返回 ACK,性能更高但可能丢消息

2、故障恢复

  • Broker 宕机:Slave 自动切换为 Master(需配合 DLedger 或 RAFT 协议)

  • 磁盘损坏:从 Slave 节点恢复数据

七、存储配置建议

八、可视化存储状态

通过命令查看存储状态:

九、总结

  • CommitLog:消息全集,顺序写入,保证高吞吐。

  • ConsumeQueue:逻辑队列索引,内存映射加速检索。

  • 设计优势:

    • 顺序写盘 + 异步构建索引 → 高性能。

    • 主从同步 + 刷盘策略 → 高可靠。

  • 适用场景:

    • 顺序写、随机读的日志型存储模型,适合消息中间件场景。

RocketMQ消息是如何存储的的更多相关文章

  1. 从源码分析RocketMq消息的存储原理

    rocketmq在存储消息的时候,最终是通过mmap映射成磁盘文件进行存储的,本文就消息的存储流程作一个整理.源码版本是4.9.2 主要的存储组件有如下4个: CommitLog:存储的业务层,接收& ...

  2. RocketMQ消息轨迹-设计篇

    目录 1.消息轨迹数据格式 2.记录消息轨迹 3.如何存储消息轨迹数据 @(本节目录) RocketMQ消息轨迹主要包含两篇文章:设计篇与源码分析篇,本节将详细介绍RocketMQ消息轨迹-设计相关. ...

  3. 源码分析RocketMQ消息轨迹

    目录 1.发送消息轨迹流程 1.1 DefaultMQProducer构造函数 1.2 SendMessageTraceHookImpl钩子函数 1.3 TraceDispatcher实现原理 2. ...

  4. RocketMQ(消息重发、重复消费、事务、消息模式)

    分布式开放消息系统(RocketMQ)的原理与实践 RocketMQ基础:https://github.com/apache/rocketmq/tree/rocketmq-all-4.5.1/docs ...

  5. RocketMQ消息模型

    rocketmq采用的是发布-订阅的模式,不需要每个消费者维护自己的消息队列,生产者将消息发送到topic,消费者订阅此topic 读取消息. 基本概念: 消息模型:消息模型包括producer,co ...

  6. RocketMQ 消息丢失场景分析及如何解决

    生产者产生消息发送给RocketMQ RocketMQ接收到了消息之后,必然需要存到磁盘中,否则断电或宕机之后会造成数据的丢失 消费者从RocketMQ中获取消息消费,消费成功之后,整个流程结束 1. ...

  7. 一张图进阶 RocketMQ - 消息发送

    前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢 ...

  8. RocketMQ消息短暂而又精彩的一生

    大家好,我是三友~~ 这篇文章我准备来聊一聊RocketMQ消息的一生. 不知你是否跟我一样,在使用RocketMQ的时候也有很多的疑惑: 消息是如何发送的,队列是如何选择的? 消息是如何存储的,是如 ...

  9. RocketMq消息队列使用

    最近在看消息队列框架 ,alibaba的RocketMQ单机支持1万以上的持久化队列,支持诸多特性, 目前RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,bin ...

  10. 程序重启RocketMQ消息重复消费

    最近在调试RocketMQ消息发送与消费的Demo时,发现一个问题:只要重启程序,RocketMQ消息就会重复消费. 那么这是什么原因导致的,又该如何解决呢? 经过一番排查,发现程序使用的Rocket ...

随机推荐

  1. 第八章 (Nginx+Lua)流量复制/AB测试/协程

    流量复制 在实际开发中经常涉及到项目的升级,而该升级不能简单的上线就完事了,需要验证该升级是否兼容老的上线,因此可能需要并行运行两个项目一段时间进行数据比对和校验,待没问题后再进行上线.这其实就需要进 ...

  2. 隐私集合求交(PSI)-两方

    在知乎上看到大佬写的关于论文:Efficient Batched Oblivious PRF with Applications to Private Set Intersection的讲解,循序渐进 ...

  3. UTS Open '21 P6 - Terra Mater

    传送门 前言 本题是一道很好的"dp"题,无论是正难反易,还是模型转化都值得称赞,尤其是最后的神之一手,让我大脑宕机. 题意描述 给定一个长度为 \(N\) 的序列 \(H\),修 ...

  4. SDN网络技术在云计算中的应用

    本文分享自天翼云开发者社区<SDN网络技术在云计算中的应用>,作者:1****m SDN(软件定义网络)是一种新型的网络架构,其基本思想是将数据平面和控制平面分离,通过集中式的控制器来管理 ...

  5. 云主机CPU和内存配比:优化资源分配的关键

    本文分享自天翼云开发者社区<云主机CPU和内存配比:优化资源分配的关键>,作者:每日知识小分享 随着云计算技术的快速发展,云主机已经成为了许多企业和个人用户首-选的计算解决方案.在部署和配 ...

  6. 天翼云GPU云主机:共享信息技术与虚拟机的完美融合

    本文分享自天翼云开发者社区<天翼云GPU云主机:共享信息技术与虚拟机的完美融合>,作者:不知不觉 在云计算领域,GPU云主机已经成为了一个备受瞩目的焦点.它的出现改变了传统IT架构的方式, ...

  7. NSSM:简化Windows服务配置,提升系统维护效率

    NSSM:简化Windows服务配置,提升系统维护效率 在Windows系统环境中,服务的配置与管理是一项复杂而重要的任务.传统的服务管理方式往往涉及繁琐的步骤,不仅效率低下,还容易出错.然而,随着N ...

  8. Q:plsql中文显示??处理

    1.查询数据库字符集select userenv('language') from dual; 2.修改NLS_LANG环境变量:将NLS_LANG环境变量设置为正确的字符集 windows设置系统环 ...

  9. Linux - centos6.6不使用ssh如何在服务器之间传输文件?

    根据上一篇的设定,如果升级openssh失败之后,又无法使用ssh,该怎么传输文件呢? 可以使用busybox进行文件传输,首先需要准备两台centos6.6服务器:ctos66-01和ctos66- ...

  10. 「一」nginx介绍

    应用场景 静态资源(js.css.图片 ) 反向代理 缓存加速(动态资源),比如社区活跃度排名 负载均衡(动态扩容.容灾) API服务 一个请求先经过nginx,再到应用服务器,访问数据库/redis ...