RocketMQ消息是如何存储的
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消息是如何存储的的更多相关文章
- 从源码分析RocketMq消息的存储原理
rocketmq在存储消息的时候,最终是通过mmap映射成磁盘文件进行存储的,本文就消息的存储流程作一个整理.源码版本是4.9.2 主要的存储组件有如下4个: CommitLog:存储的业务层,接收& ...
- RocketMQ消息轨迹-设计篇
目录 1.消息轨迹数据格式 2.记录消息轨迹 3.如何存储消息轨迹数据 @(本节目录) RocketMQ消息轨迹主要包含两篇文章:设计篇与源码分析篇,本节将详细介绍RocketMQ消息轨迹-设计相关. ...
- 源码分析RocketMQ消息轨迹
目录 1.发送消息轨迹流程 1.1 DefaultMQProducer构造函数 1.2 SendMessageTraceHookImpl钩子函数 1.3 TraceDispatcher实现原理 2. ...
- RocketMQ(消息重发、重复消费、事务、消息模式)
分布式开放消息系统(RocketMQ)的原理与实践 RocketMQ基础:https://github.com/apache/rocketmq/tree/rocketmq-all-4.5.1/docs ...
- RocketMQ消息模型
rocketmq采用的是发布-订阅的模式,不需要每个消费者维护自己的消息队列,生产者将消息发送到topic,消费者订阅此topic 读取消息. 基本概念: 消息模型:消息模型包括producer,co ...
- RocketMQ 消息丢失场景分析及如何解决
生产者产生消息发送给RocketMQ RocketMQ接收到了消息之后,必然需要存到磁盘中,否则断电或宕机之后会造成数据的丢失 消费者从RocketMQ中获取消息消费,消费成功之后,整个流程结束 1. ...
- 一张图进阶 RocketMQ - 消息发送
前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢 ...
- RocketMQ消息短暂而又精彩的一生
大家好,我是三友~~ 这篇文章我准备来聊一聊RocketMQ消息的一生. 不知你是否跟我一样,在使用RocketMQ的时候也有很多的疑惑: 消息是如何发送的,队列是如何选择的? 消息是如何存储的,是如 ...
- RocketMq消息队列使用
最近在看消息队列框架 ,alibaba的RocketMQ单机支持1万以上的持久化队列,支持诸多特性, 目前RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,bin ...
- 程序重启RocketMQ消息重复消费
最近在调试RocketMQ消息发送与消费的Demo时,发现一个问题:只要重启程序,RocketMQ消息就会重复消费. 那么这是什么原因导致的,又该如何解决呢? 经过一番排查,发现程序使用的Rocket ...
随机推荐
- 在linux系统通过OpenSSL工具自签https证书
工具介绍 OpenSSL是SSL/TLS协议的实现工具 key是私钥文件,用于对发送给客户端的数据加密,以及对从客户端接收的数据进行解密. csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证 ...
- ed25519加密签名算法及应用
刷知乎时看到一篇文章,很感兴趣,来学习一下! 转载文章:ed25519加密签名算法及应用 初次使用Github时都需上传本地的公钥,这时需要提前在本地生成密钥对,使用的是ssh-keygen命令: s ...
- linux:搭建 WordPress 个人站点
参考:链接 介绍 WordPress 是一款使用 PHP 语言开发的博客平台,您可使用通过 WordPress 搭建属于个人的博客平台.本文以 CentOS 6.5 操作系统为例,手动搭建 WordP ...
- VulNyx-Secrets
扫端口 扫描80端口发现有个secrets目录 还有个注释 继续扫发现http://192.168.200.11/secrets/login_form.php 有这个登录框 估计就是要爆破 usern ...
- 一个月狂赚百万?DeepSeek爆火背后的"卖铲人"狂欢
大家好,我是郭顺发,一个白天敲代码晚上写博客的独立开发者.最近有个叫DeepSeek R1的AI模型火得离谱--不是因为它技术多逆天,而是因为一堆人靠它一个月赚了几百万,而他们卖的东西...你绝对想不 ...
- CF1837E Play Fixing 题解
首先来考虑什么情况方案数为 \(0\): 可以确定,在某一层中,两个原本都能晋级的队伍比赛: 可以确定,在某一层中,两个原本都不能晋级的队伍比赛. 发现假如写出每一场比赛及其胜者,可以形成一棵树形结构 ...
- ABB机器人本体维修保养方法
ABB机器人维修保养一般可以参照机器人保养手册里面的描述,这种保养一般分为两种计时方式,一两年内进行一次基础保养或者机器人运行时间不超过10000小时.在对机器人本体进行保养的时候,我们该如何操作呢? ...
- @Scheduled参数及cron表达式解释
@Scheduled支持以下8个参数:1.cron:表达式,指定任务在特定时间执行:2.fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms:3.fixedDela ...
- 大数据之路Week08_day02 (Flume的使用举例(从控制台输入数据,从本地打数据到HDFS,从java代码中进行捕获打入到HDFS,flume监控http source))
在使用之前,提供一个大致思想,使用Flume的过程是确定scource类型,channel类型和sink类型,编写conf文件并开启服务,在数据捕获端进行传入数据流入到目的地. 实例一.从控制台打入数 ...
- Hi3516EV200 编译环境配置及交叉编译软件包
基础信息 OS: Ubuntu 16.04 xenial SDK 版本: Hi3516EV200R001C01SPC012 - Hi3516EV200_SDK_V1.0.1.1 SDK 包路径:Hi3 ...