RocketMQ——消息存储之数据文件结构

消息存储架构

RocketMQ作为一款高性能的消息中间件,和他的存储设计有很大的关系,本文主要针对重要的几个文件做简要的说明,部分内容都来自官网,便于后续源码的分析和理解。

如下为RocketMQ的消息存储架构图(来源官网)

RocketMQ存储文件主要构成

CommitLog

1、CommitLog文件

  1. CommitLog文件时Rocket存储消息的主要文件
  2. 生产者发送到Broker端的消息,都会以Append的方式写入到CommitLog文件
  3. 单个CommitLog文件默认为1G
  4. 文件名为当前消息的起始偏移量,长度20位,后几位为偏移量,前面补0。例00000000000000000000为第一个文件(起始偏移量为0),第二个CommitLog文件的文件名为00000000001073741824(起始偏移量为1073741824=1G)
  5. CommitLog文件中存储了每一条Message的全量数据
  6. CommitLog文件路径{$HOME}/store/commitlog/

2、CommitLog文件中存储的每一条Message格式

可以在org.apache.rocketmq.store.CommitLog.DefaultAppendMessageCallback#doAppend(long, java.nio.ByteBuffer, int, org.apache.rocketmq.store.MessageExtBrokerInner)中找到对应的属性

  1. TOTALSIZE:消息长度
  2. MAGICCODE:魔术
  3. BODYCRC:消息体CRC
  4. QUEUEID:消息队列ID
  5. FLAG:消息标记
  6. QUEUEOFFSET:消息队列的逻辑偏移量
  7. PHYSICALOFFSET:消息队列的物理偏移量
  8. SYSFLAG:消息标识(Compressed/MultiTags/prepared/commit/rollback)
  9. BORNTIMESTAMP:消息创建日期时间戳(生产端)
  10. BORNHOST:生产者端address:port
  11. STORETIMESTAMP:消息存储时间戳
  12. STOREHOSTADDRESS:消息存储端address:port
  13. RECONSUMETIMES:消息被重新消费的次数
  14. Prepared Transaction Offset:事务消息偏移量
  15. BODY:消息体
  16. TOPIC:订阅的Topic
  17. PROPERTIES:Msg属性

ConsumeQueue

说明:

  1. 消费消息的索引,作用是为了提升消费时检索消息的能力和性能
  2. 保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值
  3. 基于topic的commitlog索引文件
  4. consumequeue文件夹的组织方式如下:$HOME/store/consumequeue/{topic}/{queueId}/{fileName}
  5. 采取定长设计,每个条目20字节,8字节的commitlog物理偏移量、4字节消息长度、8字节tag hashcode
  6. 单个文件由30W个条目组成
  7. 每个ConsumeQueue文件大小约5.72M

ConsumeQueue文件结构:

IndexFile(索引文件)

说明:

  1. 通过key或时间区间来查询消息
  2. Index文件的存储位置是:$HOME \store\index${fileName}
  3. 文件名fileName是以创建时的时间戳命名的
  4. 固定的单个IndexFile文件大小约为400M
  5. 一个IndexFile可以保存 2000W个索引
  6. IndexFile的底层存储设计为在文件系统中实现HashMap结构,底层实现为hash索引

IndexFile文件结构:


RocketMQ——消息存储之数据文件结构
http://yoursite.com/post/b00d5835.html/
Author
Chase Wang
Posted on
November 26, 2022
Licensed under