RocketMQ消息存储:存储文件概述

文本简要阐述文件存储的情况,说明消息文件之间的关系,消息文件的物理存储情况,以及逻辑映射情况,本文是个概述篇,为后续ComitLog文件、ConsumeQueue文件以及Index文件分析做个基础。

1. 存储概述

RocketMQ存储文件的路径在:${ROCKET_HOME}/store,主要有以下文件:

  1. commitlog:消息存储目录

  2. config:运行期间一些配置信息,主要以下信息

    1)consumerFilter.json:主题消息过滤信息

    2)consumerOffset.json:集群消费模式消息消费进度

    3)delayOffset.json:延时消息队列拉取进度

    4)subscriptionGroup.json:消息消费组配置信息

    5)topics.json:topic配置属性

  3. consumerqueue:消息消费队列存储目录

  4. index:消息索引文件存储目录

  5. abort:如果存在abort文件,说明Broker非正常关闭,该文件默认启动时创建,正常退出前删除

  6. checkpoint:文件检测点,存储commitlog文件最后一次刷盘时间戳、consumerqueue最后一次刷盘时间、index索引文件最后一次刷盘时间戳

在此阐述一下CommitLog、ConsumeQueue和Index文件三者之间的关系。

RocketMQ主要存储的文件包括:CommitLog文件,ConsumeQueue文件、Index文件。RocketMQ将所有的消息都存储在同一个Commitlog文件中,确保消息发送时顺序写文件,尽最大的能力确保消息发送的高性能和高吞吐量。

但是消息中间件一般是基于消息主题的订阅机制,消息在同一个文件检索会很麻烦,为了提高消息消费的效率,RocketMQ引入了ConsumeQueue消息队列文件,每个消息主题包含多个消息消费队列,每个消息队列对应的文件。实际上RocketMQ的消费粒度会到队列级别。

为了加快消息的检索性能,根据消息的属性快速从CommitLog文件中检索消息,RocketMQ引入了Index索引文件。

这三个文件的关系如下图所示:消息到达CommitLog之后,将异步转发到ConsumeQueue,供消费者消费消息。同时也会异步转发到Index文件(图中的IndexFile文件)。

2. 物理文件存储

CommitLog、ConsumeQueue和Index文件被设计成固定文件大小,其中,文件名就是消息的偏移量(CommitLog就是消息的偏移量,ConsumeQueue就是队列消息的偏移量,也就是队列消息的大小)

markdown 复制代码
commitlog
	- 00000000000000000000
consumequeu
	- TopicTest
		- 0
			- 00000000000000000000
		- 1
			- 00000000000000000000
		- 2
			- 00000000000000000000
		-3 
			- 00000000000000000000
index 
	- 20240109194526605

在RocketMQ内部,经常会有两个偏移量:

  • 物理偏移量:实际就是CommitLog文件中对应消息的存储位置。CommitLog会记录每个消息的大小,结合文件名就是消息的偏移量,根据物理偏移量就很容易定位消息在哪个文件。

  • 逻辑偏移量:实际就是ConsumeQueue的消息数量,每个ConsumeQueue文件的偏移量都是从0开始递增的数字(因为ConsumeQueue消息大小固定,所以根据数值*消息大小就能找到ConsumeQueue的数据),拉取消息就会根据这个偏移量,从ConsumeQueue中找到物理偏移量,然后根据物理偏移量找到具体的消息。

3. 逻辑映射

RocketMQ通过使用内存映射来提高文件IO访问性能,无论是CommitLog、ConsumeQueue还是Index,单个文件都被设计为固定长度,如果一个文件写满以后再创建一个新文件,文件名就为该文件第一条消息对应的全局物理偏移量(Index文件是使用时间作为文件名)。

RocketMQ使用MappedFile、MappedFileQueue来封装存储文件,其中:

  • MappedFileQueue是MappedFile的管理容器,是对存储目录的封装。例如CommitLog文件存储路径${ROCKTEMQ_HOME}/store/commitlog/,该目录下会存在多个内存映射文件(MappedFile)
  • MappedFile是RocketMQ内存映射文件的具体实现,内部会进行commit、flush等逻辑,在后续使用到的场景上在做详细介绍。

4. checkpoint文件

checkpoint文件的作用,是记录CommitLog、ConsumeQueue、Index文件的刷盘时间点,当恢复时可以根据刷盘时间点确保哪些消息是正确的。文件固定长度为4K,但是只用了该文件的前面24个字节,存储格式如下:

scss 复制代码
physicMsgTimestamp(8字节) | logicsMsgTimestamp(8字节) | indexMsgTimestamp(8字节)

physicMsgTimestamp: CommitLog文件刷盘时间

logicsMsgTimestamp:ConsumeQueue文件刷盘时间

indexMsgTimestamp:Index文件刷盘时间

5. 参考资料

相关推荐
xiaogg36785 分钟前
springcloud oauth2 自定义token实现
spring boot·后端·spring cloud
pixcarp9 分钟前
Nginx实战部署与踩坑总结 附带详细配置教程
服务器·前端·后端·nginx·golang
va学弟12 分钟前
Agent入门开发(2):个性化功能添加
java·服务器·ai
84869811912 分钟前
Cursor 用 Java + Vue3 做了一个可落地的酒店管理系统(HMS),支持多门店、RBAC、财务结算,源码开源!
java·开发语言·开源
神奇小汤圆18 分钟前
JAVA 面经汇总2026最新版,1100+ 大厂面试题附答案详解
后端
程序员老邢23 分钟前
【技术底稿 23】Ollama + Docker + Ubuntu 部署踩坑实录:网络通了,参数还在调
java·经验分享·后端·ubuntu·docker·容器·milvus
:12126 分钟前
java数组2
java·算法·排序算法
酉鬼女又兒31 分钟前
JavaLeetCode 第一题「两数之和」:从暴力枚举到一遍哈希表的正确与错误实现,详解HashMap核心知识点及常见陷阱
java·开发语言·数据结构·算法·leetcode·职场和发展·散列表
JackSparrow41433 分钟前
彻底理解Java NIO(一)C语言实现 单进程+多进程+多线程 阻塞式I/O 服务器详解
java·linux·c语言·网络·后端·tcp/ip·nio
小江的记录本35 分钟前
【微服务与云原生架构】Serverless架构、FaaS/BaaS、核心原理、优缺点
java·后端·微服务·云原生·架构·系统架构·serverless