RocketMq-Broker-存储

consumeQueue

  1. consumeQueue文件默认存储在{user.dir}/store/consumequeue。其内目录结构为consumequeue/{topicName}/{queueId}/{fileName},文件默认大小600万字节。
  2. 文件命名规则:00000000000000000000,00000000000006000000,00000000000120000000…以此类推。
  3. 文件内存储的数据格式:commitlog-offset(commitlog文件物理偏移 long 8byte)+size(消息大小 int 4byte)+tagscode(tag的hashcode long 8byte)。每条占用20字节,每个文件可存储30W条。
8 Byte 4 Byte 8 Byte
commitlog offse size tag Hashcode

commitLog

  1. commitLog文件默认存储在{user.dir}/store/commitlog,文件默认大小1G=1073741824字节
  2. 文件名称规则:00000000000000000000,00000000001073741824,00000000002147483648…以此类推。
  3. 文件内存储的数据格式,部分含义待补充。
序号 名称 长度(字节) 含义
1 TOTALSIZE 4 消息长度
2 MAGICCODE 4 MAGIC CODE 固定值 daa320a7
3 BODYCRC 4
4 QUEUEID 4
5 FLAG 4
6 QUEUEOFFSET 8
7 PHYSICALOFFSET 8
8 SYSFLAG 4
9 BORNTIMESTAMP 8
10 BORNHOST 8
11 STORETIMESTAMP 8
12 STOREHOSTADDRESS 8
13 RECONSUMETIMES 4
14 Prepared Transaction Offset 8
15 BODY LENGHT 4 消息体长度
16 BODY CONTENT ? 消息体
17 TOPIC LENGHT 1 Topic长度
18 TOPIC CONTENT ? Topic名称
19 PROPERTIES LENGHT 2 properties长度
20 PROPERTIES CONTENT ? properties内容

代码参考:com.alibaba.rocketmq.store.CommitLog.DefaultAppendMessageCallback#doAppend

消息查找

从consumequeue读取消息,根据commitlog offse/1073741824=N得到在第N+1个commitlog文件中,消息的开始位置commitlog offse-(1073741824*N) = fileOffset.从fileOffset字节开始读取,读取长度在首个4字节中。

TODO:如果消息体跨文件了怎样处理??

走一走看一看

Talk is cheap,在我本地机器上,执行example中的例子发送一个消息进行分析。

作者: wuzhaoyang(John)
出处: http://wuzhaoyang.me/
因为作者水平有限,无法保证每句话都是对的,但能保证不复制粘贴,每句话经过推敲。希望能表达自己对于技术的态度,做一名优秀的软件工程师。