RocketMQ篇之-消息存储

RocketMQ作为一款分布式消息中间件,高可靠性是其最重要的特性之一。

所以需要将消息进行持久化存储,以保证消息不丢失。

RocketMQ的消息存储是RocketMQ的核心组件之一,负责消息的存储和传输。RocketMQ的消息存储主要包括CommitLog、ConsumeQueue、IndexFile、Checkpoint等几个部分。

(前置)消息存储交互流程

  1. 生产者发送消息MQ;
  2. MQ将消息存到存储系统;
  3. 返回消息存储结果;
  4. 消费者从存储系统拉取消息,消费消息;
  5. 消费者消费成功,返回消费结果;
  6. 存储系统删除消息。

(一)存储系统

在上面的流程中,存储系统是RocketMQ的核心组件之一,负责消息的读写。

存储系统有以下几种选择:

  1. 内存存储等;
  2. 关系型数据库存储;
  3. 文件存储;

在RocketMQ中,使用的是文件存储。

1. 内存存储

内存存储是一种高性能的存储方式,但是内存存储的数据是不稳定的,一旦断电,数据就会丢失。即便是以Redis为代表的内存数据库,也无法保证数据的持久化,在持久化方面,还是选择文件存储。所以对消息来说,内存存储是不适合的。

2. 关系型数据库存储

关系型数据库存储是一种常见的存储方式,像MySQL、Oracle等都可以作为消息存储。阿帕奇的ActiveMQ、Pulsar等都是使用关系型数据库作为消息存储。但其实关系型数据库底层也是文件存储,所以对比直接使用文件存储,关系型数据库存储的性能会有所下降。

3. 文件存储

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

(二)消息的存储和发送

1. 消息存储(顺序写入)

磁盘的读写速度虽然比内存慢,但是和网络IO相比,磁盘的读写速度还是很快的。现在的磁盘读写速度已经达到了几百MB/s甚至上千MB/s,所以对于消息存储来说,磁盘的读写速度是足够的。

但是在随机读写方面,磁盘的性能就会有比较严重的下降,所以RocketMQ的消息存储是顺序写入的,这样可以提高磁盘的读写性能。

2. 消息发送(零拷贝)

消息的发送,需要将磁盘内的数据发送到网络中,在这个过程中,会涉及到系统的内核态和用户态的切换,这个过程是比较耗时的。

把磁盘数据发送到网络中,需要经过以下几个步骤:

  1. 从磁盘中读取数据;
  2. 将读取的数据发送到网络中;

看似只有两个步骤,但是在实际的操作中,还会涉及到内核态和用户态的切换和数据复制等操作:

  1. 从磁盘中读取数据,磁盘复制 -> 内核态的缓冲区;
  2. 内核态的缓冲区复制 -> 用户态的缓冲区;
  3. 将数据发送到网络中,从用户态的缓冲区复制 -> 网络驱动的内核态缓冲区;
  4. 网络驱动的内核态缓冲区复制 -> 网络中;

重要️: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的消息持久化的方式,保证消息不会丢失。

我们讲了以下几部分相关的内容:

  1. 存储系统的选择,选择了文件存储。
  2. 消息的存储和发送,通过顺序写入和零拷保证性能。(也是RocketMQ为什么高性能的主要原因)
  3. 存储文件结构,CommitLog、ConsumeQueue和IndexFile。
  4. 刷盘机制,同步刷盘和异步刷盘。

这些内容是RocketMQ消息存储的核心内容,对于理解RocketMQ的消息存储机制非常重要。希望本文对你有所帮助,如果有任何问题,欢迎留言讨论。

【RocketMQ 消息中间件】RocketMQ篇之-消息存储 为什么性能高 CommitLog ConsumeQueue IndexFile 刷盘机制 同步 异步的更多相关文章

  1. 【RocketMQ】消息的刷盘机制

    刷盘策略 CommitLog的asyncPutMessage方法中可以看到在写入消息之后,调用了submitFlushRequest方法执行刷盘策略: public class CommitLog { ...

  2. Kafka、RabbitMQ、RocketMQ消息中间件的对比

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,目前对Kafka.RabbitMQ.RocketMQ这三个消息中间件做下对比分析. - - k ...

  3. 消息中间件——rocketmq环境配置

    产生原因 RocketMQ概述 RocketMQ 是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级 ...

  4. 消息中间件--"rocketmq"01之环境搭建

    前置知识 ssh工具 连接linux工具SecureCRT 颜色设置,参考 中文乱码,参考 Linux相关知识 centos7 防火墙firewalld的基本使用,参考 启动: systemctl s ...

  5. RocketMQ中Broker的刷盘源码分析

    上一篇博客的最后简单提了下CommitLog的刷盘  [RocketMQ中Broker的消息存储源码分析] (这篇博客和上一篇有很大的联系) Broker的CommitLog刷盘会启动一个线程,不停地 ...

  6. RocketMQ消息丢失解决方案:同步刷盘+手动提交

    前言 之前我们一起了解了使用RocketMQ事务消息解决生产者发送消息时消息丢失的问题,但使用了事务消息后消息就一定不会丢失了吗,肯定是不能保证的. 因为虽然我们解决了生产者发送消息时候的消息丢失问题 ...

  7. RocketMQ(4)---RocketMQ核心配置讲解

    RocketMQ核心配置讲解 RocketMQ的核心配置在broker.conf配置文件里,下面我们来分析下它. 一.broker.conf配置 下面只列举一些常用的核心配置讲解. 1.broker. ...

  8. Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能-转自阿里中间件

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...

  9. Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能

    引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...

  10. 转:Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能 (阿里中间件团队博客)

    from: http://jm.taobao.org/2016/04/01/kafka-vs-rabbitmq-vs-rocketmq-message-send-performance/ 引言 分布式 ...

随机推荐

  1. 离线快速LCA(最近公共祖先) Tarjan算法

    离线快速LCA(最近公共祖先) Tarjan算法 前言 对于 OIer 来说,LCA 一直是处理树上问题的好帮手,无论是倍增还是树剖都有着优秀的 \(\log n\) 的复杂度.不过由于我们(数据规模 ...

  2. 黑盒视角下的RESTful API安全测试

    目录 前言 关于OWASP API TOP 10 REST API接口测试思路 接口权限测试 接口校验测试 接口滥用测试 总结 前言 RESTful API(或称RESTful Web API)在线开 ...

  3. bootstrapTable初始化常用参数

    bootstrapTable初始化常用参数,前端分页排序,后端获取表格数据 $('#table').bootstrapTable({ toolbar: '#mybar', //工具按钮用哪个容器 st ...

  4. 使用 Apache MINA 开发高性能网络应用程序

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...

  5. 简单端口映射、转发、重定向工具之Rinetd

    ◆一.概述 Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具.将 TCP 连接从一个 IP 地址和端口重定向到另一个.它处理文件中/etc/rinetd ...

  6. django性能分析工具之silk

    在开发过程中,有很多时候需要了解程序性能瓶颈,比如程序执行时间.网络耗时.数据库连接时间等:那接下来,django silk就派上用场了! 安装 https://github.com/jazzband ...

  7. SharpZipLib解压.tar.gz

    上一篇文章我们说了如何用SharpZipLib来压缩.tar.gz,这篇文章我们来看看如何解压. 直接上代码: using ICSharpCode.SharpZipLib.GZip; using IC ...

  8. web移动端基础

    1.像素密度 PPI 说到屏幕就离不开2个因素,屏幕大小和屏幕分辨率. PPI是Pixels Per Inch缩写,pixels per inch所表示的是每英寸所拥有的像素(pixel)数目. PP ...

  9. 一个使用 WPF 开发的管理系统

    前言 最近发现有不少小伙伴在学习 WPF,今天大姚给大家分享一个使用 WPF 开发的管理系统,该项目包含了用户登录.人员管理.角色授权.插件管理.职位管理.主页功能(邮件.皮肤.设置)等功能,对于一个 ...

  10. Element Plus组件库el-select组件多选回显踩坑

    前情 公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vu ...