RocketMQ 采用文件系统的方式来存储消息,消息的主要存储文件包括 CommitLog 文件、ConsumeQueue 文件、IndexFile 文件。

  • CommitLog 是消息存储的物理文件,所有消息主题的消息都存储在 CommitLog 文件中,每个 Broker 上的
    CommitLog 被当前机器上的所有 ConsumeQueue 共享。CommitLog 中的文件默认大小为 1G,可以动态配置;
    当一个文件写满以后,会生成一个新的 CommitLog 文件。所有的 Topic 数据是顺序写入在 CommitLog 文件中的。

  • ConsumeQueue 是消息消费的逻辑队列,消息达到 CommitLog
    文件后将被异步转发到消息消费队列,供消息消费者消费,这里面包含 MessageQueue 在 CommitLog 中的物理位置偏移量
    Offset,消息实体内容的大小和 Message Tag 的 hash 值。每个文件默认大小约为 600W
    个字节,如果文件满了后会也会生成一个新的文件。

  • IndexFile 是消息索引文件,Index 索引文件提供了对 CommitLog 进行数据检索,提供了一种通过 key
    或者时间区间来查找 CommitLog 中的消息的方法。在物理存储中,文件名是以创建的时间戳明明,固定的单个 IndexFile 大小大概为
    400M,一个 IndexFile 可以保存 2000W 个索引。

消息存储的整体结构

RocketMQ 的消息存储采用的是混合型的存储结构,也就是 Broker 单个实例下的所有队列公用一个日志数据文件
CommitLog。这个是和 Kafka 又一个不同之处。为什么不采用 Kafka 的设计,针对不同的 Partition
存储一个独立的物理文件呢?这是因为在 Kafka 的设计中,一旦 Kafka 中 Topic 的 Partition
数量过多,队列文件会过多,那么会给磁盘的 IO 读写造成比较大的压力,也就造成了性能瓶颈。所以 RocketMQ 进行了优化,消息主题统一存储在
CommitLog 中。当然它也有它的优缺点。

  • 优点在于:由于消息主题都是通过 CommitLog 来进行读写,ConsumerQueue 中只存储很少的数据,所以队列更加轻量化。对于磁盘的访问是串行化从而避免了磁盘的竞争。

  • 缺点在于:消息写入磁盘虽然是基于顺序写,但是读的过程确是随机的。读取一条消息会先读取 ConsumeQueue,再读 CommitLog,会降低消息读的效率。

消息发送到消息接收的整体流程

1、Producer 将消息发送到 Broker 后,Broker 会采用同步或者异步的方式把消息写入到
CommitLog。RocketMQ 所有的消息都会存放在 CommitLog 中,为了保证消息存储不发生混乱,对 CommitLog
写之前会加锁,同时也可以使得消息能够被顺序写入到 CommitLog,只要消息被持久化到磁盘文件 CommitLog,那么就可以保证
Producer 发送的消息不会丢失。

2、CommitLog 持久化后,会把里面的消息 Dispatch 到对应的 Consume Queue 上,Consume Queue
相当于 Kafka 中的 Partition,是一个逻辑队列,存储了这个 Queue 在 CommitLog 中的起始 Offset,log
大小和 MessageTag 的 hashCode。

3、当消费者进行消息消费时,会先读取 ConsumerQueue,逻辑消费队列 ConsumeQueue 保存了指定 Topic 下的队列消息在 CommitLog 中的起始物理偏移量 Offset,消息大小、和消息 Tag 的 HashCode 值。

4、直接从 ConsumerQueue 中读取消息是没有数据的,真正的消息主体在 CommitLog 中,所以还需要从 CommitLog 中读取消息。

RocketMQ 持久化相关推荐

  1. Rocketmq持久化

    kafka单机队列/分区超过64个厚,load时间明显会飙升,队列越多,load越高,发送消息时间变长 RocketMQ 单机支持支持5W队列,load时间稳定 为什么? 因为二者的持久化方式差异 k ...

  2. 消息队列重要机制讲解以及MQ设计思路(kafka、rabbitmq、rocketmq)

    目录 <Kafka篇> 简述kafka的架构设计原理(入口点) 消息队列有哪些作用(简单) 消息队列的优缺点,使用场景(基础) 消息队列如何保证消息可靠传输 死信队列是什么?延时队列是什么 ...

  3. RocketMQ知识点整理

    RocketMQ知识点整理 一.消息队列 二.RocketMQ简介 RocketMQ-组件 RocketMQ架构: 三. RocketMQ理解性问题整理 1.使用消息中间件之前需要先了解"同 ...

  4. 2021秋招学习笔记

    PS:csdn上有很多图片加载不出来,有PDF版在我的资源.(如果没有1积分可以评论我,直接发给你邮箱) 文章目录 Java基础篇学习(7/3-7/4) 数据类型 泛型.反射.注解.序列化(加实例) ...

  5. 2020年Java面试经典100问,进入BAT不是梦

    本文由公众号「Java旅途」整理,设计到的内容由java基础.数据库.SSM框架.redis.消息队列.spring boot.spring cloud.git及一些前端知识.整理时间为2019-11 ...

  6. RocketMQ 消息持久化机制

    我们知道 RocketMQ 是一款高性能.高可靠的分布式消息中间件,高性能和高可靠是很难兼得的.因为要保证高可靠,那么数据就必须持久化到磁盘上,将数据持久化到磁盘,那么可能就不能保证高性能了. Roc ...

  7. 从源码分析RocketMQ系列-RocketMQ消息持久化源码详解

    导语   在上篇分析中,提到了一个概念处理器,并且在进入到最终NettyIO的时候看到了一个Pair的对象,这个对象存储了两个对象,一个是执行器,一个是处理器,在进入Runable对象的时候看到封装到 ...

  8. RocketMQ入门到入土(五)消息持久化存储源码解析

    精彩推荐 一百期Java面试题汇总 SpringBoot内容聚合 IntelliJ IDEA内容聚合 Mybatis内容聚合 接上一篇:RocketMQ入门到入土(四)producer生产消息源码剖析 ...

  9. rocketmq消息持久化到mysql_RocketMQ之事务消息

    由于工作流引擎项目中,工作流引擎服务和业务服务是分开的,所以就涉及到了分布式事务的问题.综合考虑到并发量和分布式事务的保障,最终选择了事务消息的方式. 首先我们来介绍下本地消息表这种方案,当消息队列不 ...

最新文章

  1. 211高校神级硕士论文刷屏!75行字错了20行!学校回应:导师停招
  2. 无处不在的人工智能,IBM沃森的20个行业应用
  3. ASP.NET Core 源码学习之 Logging[3]:Logger
  4. 实用必备xp框架模块_Xposed框架安装、使用以及插件开发
  5. apex英雄机器人探路者怎么玩_Apex英雄探路者机器人实战技巧攻略[多图]
  6. 神州信息预计2020年全年净利润4.35亿至6亿元
  7. linux中mysql主主搭建_mysql 主从配置 主主配置
  8. CloudStack 4.3功能前瞻
  9. 在Mac上使用鼠标键来控制指针的方法
  10. python如何运行整个项目_如何运行django项目
  11. 2合1笔记本 android,华为二合一笔记本支持Android可能是鸡肋
  12. 以互联网公司的经验告诉大家,架构师究竟比高级开发厉害在哪?
  13. IO字节流读取文本中文乱码
  14. 真实原创,记录程序员的艰辛生活-接私单记1
  15. PHP替换指定字符 阿星小栈
  16. web全栈工程师技能介绍
  17. 华为S5700实战配置
  18. 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)
  19. java 虚拟机 Java内存结构 JVM垃圾回收机制算法
  20. 第十四周 项目2 根据成绩排序或姓名排序输出姓名或成绩问题

热门文章

  1. Nifti1文件格式
  2. 如何护理吞咽困难、饮水呛咳的患者?
  3. one day网页重构
  4. [Python] 抓取时光网的电影列表并生成网页
  5. 高校计算机等级一级考试试题,全国高校计算机等级考试一级试题.doc
  6. 5g在计算机中的应用,以后5G能不能运用在电脑上面?
  7. 每个程序员都应该参加一次 GDD
  8. 实现倒计时 JavaScript(定时器 setInterval)
  9. Redis详解及在项目中应用
  10. 编辑任务EditorTask控件为什么不能使用