【RocketMQ 消息中间件】RocketMQ篇之-消息存储 为什么性能高 CommitLog ConsumeQueue IndexFile 刷盘机制 同步 异步
RocketMQ篇之-消息存储
RocketMQ作为一款分布式消息中间件,高可靠性是其最重要的特性之一。
所以需要将消息进行持久化存储,以保证消息不丢失。
RocketMQ的消息存储是RocketMQ的核心组件之一,负责消息的存储和传输。RocketMQ的消息存储主要包括CommitLog、ConsumeQueue、IndexFile、Checkpoint等几个部分。
(前置)消息存储交互流程
- 生产者发送消息MQ;
- MQ将消息存到存储系统;
- 返回消息存储结果;
- 消费者从存储系统拉取消息,消费消息;
- 消费者消费成功,返回消费结果;
- 存储系统删除消息。

(一)存储系统
在上面的流程中,存储系统是RocketMQ的核心组件之一,负责消息的读写。
存储系统有以下几种选择:
- 内存存储等;
- 关系型数据库存储;
- 文件存储;
在RocketMQ中,使用的是文件存储。
1. 内存存储
内存存储是一种高性能的存储方式,但是内存存储的数据是不稳定的,一旦断电,数据就会丢失。即便是以Redis为代表的内存数据库,也无法保证数据的持久化,在持久化方面,还是选择文件存储。所以对消息来说,内存存储是不适合的。
2. 关系型数据库存储
关系型数据库存储是一种常见的存储方式,像MySQL、Oracle等都可以作为消息存储。阿帕奇的ActiveMQ、Pulsar等都是使用关系型数据库作为消息存储。但其实关系型数据库底层也是文件存储,所以对比直接使用文件存储,关系型数据库存储的性能会有所下降。

3. 文件存储
文件存储是一种常见的存储方式,像Kafka、RocketMQ、RabbitMQ等都是使用文件存储。文件存储的优点是性能高,稳定性好,适合消息存储。

(二)消息的存储和发送
1. 消息存储(顺序写入)
磁盘的读写速度虽然比内存慢,但是和网络IO相比,磁盘的读写速度还是很快的。现在的磁盘读写速度已经达到了几百MB/s甚至上千MB/s,所以对于消息存储来说,磁盘的读写速度是足够的。
但是在随机读写方面,磁盘的性能就会有比较严重的下降,所以RocketMQ的消息存储是顺序写入的,这样可以提高磁盘的读写性能。
2. 消息发送(零拷贝)
消息的发送,需要将磁盘内的数据发送到网络中,在这个过程中,会涉及到系统的内核态和用户态的切换,这个过程是比较耗时的。
把磁盘数据发送到网络中,需要经过以下几个步骤:
- 从磁盘中读取数据;
- 将读取的数据发送到网络中;
看似只有两个步骤,但是在实际的操作中,还会涉及到内核态和用户态的切换和数据复制等操作:
- 从磁盘中读取数据,磁盘复制 -> 内核态的缓冲区;
- 内核态的缓冲区复制 -> 用户态的缓冲区;
- 将数据发送到网络中,从用户态的缓冲区复制 -> 网络驱动的内核态缓冲区;
- 网络驱动的内核态缓冲区复制 -> 网络中;
重要️:RocketMQ通过mmap的方式将磁盘文件映射到内存中,这样可以减少内核态和用户态的切换,减少数据的复制,提高性能,也就是所谓的零拷贝。


(三)存储文件结构

在RocketMQ中,有三个重要的文件类型:commitlog、consumequeue和index文件。它们分别有不同的用途和存储内容。
1. CommitLog
用途:
CommitLog文件是RocketMQ存储消息的核心文件。所有的消息首先都会被写入到CommitLog文件中。
它以顺序写的方式保存消息,以确保写入的高性能和可靠性。
存储内容:
CommitLog文件存储的是消息的完整内容,包括消息的元数据(如消息ID、主题、队列ID等)和消息体。
联系:
所有消息最初都会写入到CommitLog文件中,然后再由消息服务组件(例如:ConsumeQueue和IndexFile)进行进一步的处理。
2. ConsumeQueue
用途:
ConsumeQueue是RocketMQ的消费者队列文件,主要用于提高消息消费的效率。
它相当于消息的索引文件,消费者可以通过ConsumeQueue快速定位到需要消费的消息在CommitLog中的位置。
存储内容:
ConsumeQueue文件存储的是消息在CommitLog中的物理偏移量、消息大小和消息的标签哈希值。
联系和区别:
ConsumeQueue是从CommitLog文件中生成的,用于加速消息消费。它只存储消息的索引信息,而不是消息的完整内容。
3. IndexFile
用途:
IndexFile是RocketMQ的索引文件,主要用于通过消息的索引(例如:消息的唯一标识符Key)快速查找消息。
它实现了基于哈希的索引机制,支持消息的快速检索。
存储内容:
IndexFile文件存储的是消息的Key(唯一标识符)、消息的物理偏移量和消息的存储时间。
联系和区别:
IndexFile也是从CommitLog文件中生成的,但它的目的是为了提供消息的快速检索功能。
与ConsumeQueue不同,IndexFile是通过消息的Key来查找消息,而不是通过主题和队列。ConsumeQueue是通过消息的主题和队列ID来查找消息。
总结
CommitLog:RocketMQ中存储所有消息的核心文件,保存消息的完整内容。
ConsumeQueue:消费者队列文件,用于加速消息消费,存储消息的索引信息。
IndexFile:索引文件,用于快速检索消息,存储消息的Key和物理偏移量。
这三种文件共同协作,确保了RocketMQ的高性能和高可靠性。CommitLog负责消息的存储,ConsumeQueue提高了消息的消费效率,而IndexFile则提供了消息的快速检索能力。
(四)刷盘机制
RocketMQ的消息存在磁盘中,这样能保证在断电后消息不会丢失。
在消息写入磁盘的过程中,有两种刷盘机制:同步刷盘和异步刷盘。

1. 同步刷盘
同步刷盘是指在消息写入磁盘后,需要等待磁盘的写入操作完成后,才返回写入成功的结果。
同步刷盘的优点是数据安全,可以保证消息不会丢失。但是同步刷盘的缺点是性能较差,因为需要等待磁盘的写入操作完成后才能返回结果。
2. 异步刷盘
异步刷盘是指在消息写入磁盘后,不需要等待磁盘的写入操作完成,可以立即返回写入成功的结果,然后由后台线程负责将数据刷盘到磁盘中。
异步刷盘的优点是性能较好,因为不需要等待磁盘的写入操作完成,可以立即返回结果。但是异步刷盘的缺点是数据不安全,可能会丢失部分消息。
选择
在实际的应用中,可以根据业务的需求选择合适的刷盘机制。如果对数据的安全性要求较高,可以选择同步刷盘;如果对性能要求较高,可以选择异步刷盘。
总结
RocketMQ的消息存储是RocketMQ的消息持久化的方式,保证消息不会丢失。
我们讲了以下几部分相关的内容:
- 存储系统的选择,选择了文件存储。
- 消息的存储和发送,通过顺序写入和零拷保证性能。(也是RocketMQ为什么高性能的主要原因)
- 存储文件结构,CommitLog、ConsumeQueue和IndexFile。
- 刷盘机制,同步刷盘和异步刷盘。
这些内容是RocketMQ消息存储的核心内容,对于理解RocketMQ的消息存储机制非常重要。希望本文对你有所帮助,如果有任何问题,欢迎留言讨论。
【RocketMQ 消息中间件】RocketMQ篇之-消息存储 为什么性能高 CommitLog ConsumeQueue IndexFile 刷盘机制 同步 异步的更多相关文章
- 【RocketMQ】消息的刷盘机制
刷盘策略 CommitLog的asyncPutMessage方法中可以看到在写入消息之后,调用了submitFlushRequest方法执行刷盘策略: public class CommitLog { ...
- Kafka、RabbitMQ、RocketMQ消息中间件的对比
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,目前对Kafka.RabbitMQ.RocketMQ这三个消息中间件做下对比分析. - - k ...
- 消息中间件——rocketmq环境配置
产生原因 RocketMQ概述 RocketMQ 是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级 ...
- 消息中间件--"rocketmq"01之环境搭建
前置知识 ssh工具 连接linux工具SecureCRT 颜色设置,参考 中文乱码,参考 Linux相关知识 centos7 防火墙firewalld的基本使用,参考 启动: systemctl s ...
- RocketMQ中Broker的刷盘源码分析
上一篇博客的最后简单提了下CommitLog的刷盘 [RocketMQ中Broker的消息存储源码分析] (这篇博客和上一篇有很大的联系) Broker的CommitLog刷盘会启动一个线程,不停地 ...
- RocketMQ消息丢失解决方案:同步刷盘+手动提交
前言 之前我们一起了解了使用RocketMQ事务消息解决生产者发送消息时消息丢失的问题,但使用了事务消息后消息就一定不会丢失了吗,肯定是不能保证的. 因为虽然我们解决了生产者发送消息时候的消息丢失问题 ...
- RocketMQ(4)---RocketMQ核心配置讲解
RocketMQ核心配置讲解 RocketMQ的核心配置在broker.conf配置文件里,下面我们来分析下它. 一.broker.conf配置 下面只列举一些常用的核心配置讲解. 1.broker. ...
- Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能-转自阿里中间件
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...
- Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...
- 转:Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能 (阿里中间件团队博客)
from: http://jm.taobao.org/2016/04/01/kafka-vs-rabbitmq-vs-rocketmq-message-send-performance/ 引言 分布式 ...
随机推荐
- 干货分享:Air700ECQ的硬件设计,第三部分
5. 电器特性,可靠性,射频特性 5.1. 绝对最大值 下表所示是模块数字.模拟管脚的电源供电电压电流最大耐受值. 表格 17:绝对最大值 参数 最小 最大 单位 VBAT -0.3 4.7 V ...
- OpenWRT/iStoreOS 不从头编译内核安装4G LTE网卡 Quectel EM05-CE记录
我的机器是x86装了iStoreOS,有4G网卡Quectel EM05 https://www.quectel.com/cn/product/lte-em05 主要参考资料如下 https://ww ...
- php xattr操作文件扩展属性再续
今天偶然发现自己电脑还有一个隐藏硬盘,500G的我平时没挂载,就没用到,然后这次就给它挂载了,然后发现读取文件,操作xattr都很慢,比之前速度慢10倍左右,猜测可能是固态硬盘和机械硬盘的差别关系.看 ...
- Java 编程的动态性,第 1 部分: 类和类装入
研究类以及 JVM 装入类时所发生的情况 这一有关 Java 编程动态方面的新的系列文章研究了执行 Java 应用程序时幕后所发生的事情.企业 Java专家 Dennis Sosnoski 提供了 J ...
- Django之model外键
外键和表关系 外键: 在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam.如果使用的是InnoDB引擎,是支持外键约束的.外键的存在使得ORM框架在处理表关系的时候异常的强大.因 ...
- .NET Conf China 2024 AI相关内容解析
.NET Conf China 2024中国 .NET 开发者峰会即将在上海召开,这次大会是一届完全由社区组织举办的中国.NET 开发者盛会,我们筹备大会之初就定下了大会的主题是"智能.创新 ...
- Linux C/C++编程中的多线程编程基本概念
8.2.1 操作系统和多线程 要在应用程序中实现多线程,必须有操作系统的支持.Linux 32位或64位操作系统对应用程序提供了多线程的支持,所以Windows NT/2000/XP/7/8/10是 ...
- ELSTICSEARCH 将数据从热节点转到冷节点
在ES查询时,有些数据是热点数据,这些数据是需要需要更好的机器配置的节点,当数据变得不是那么重要的时候,我们需要转到配置相对低的节点上. 比如热点新闻专题,我们需要更好的机器,热点过后,这些数据不再需 ...
- 『玩转Streamlit』--表单Form
在Streamlit中,Form组件是一种特殊的UI元素,允许用户输入数据而不立即触发应用的重新运行. 这对于创建需要用户输入多个参数后再进行处理的交互式表单非常有用. 1. 概要 Form组件的主要 ...
- Mac文件拷贝Win后的._文件清理
前言 我们在从mac向win拷贝文件后总会多出来 部分 ._ 开头的文件或名为.DS_Store的文件 根据上图在苹果官方社区的回答来看,这些文件存储了主文件的一些资料,图表等数据,如果说未来这些文件 ...