RocketMQ消息的文件组织形式
RocketMQ文件的组织形式主要围绕消息的高效存储与检索设计,主要包括CommitLog、ConsumeQueue和IndexFile三类文件。以下是对这三类文件组织形式的详细阐述:
1. CommitLog文件
- 作用:CommitLog是消息存储的主体文件,用于存储Producer端写入的消息主体内容。
- 组织形式:
- 所有topic的消息都存储在同一个CommitLog文件中,确保消息发送时按顺序写文件,以追求极致的消息存储性能和高吞吐量。
- 单个文件大小默认1G,文件名长度为20位,左边补零,剩余为起始偏移量。例如,第一个文件名为
00000000000000000000
,代表起始偏移量为0,文件大小为1G。当第一个文件写满后,第二个文件名为00000000001073741824
,以此类推。
- 存储内容:消息内容不是定长的,每条消息在CommitLog中的存储结构包括消息长度、消息体、消息属性等。
2. ConsumeQueue文件
- 作用:ConsumeQueue是消息消费队列文件,主要用于提高消息消费的性能。由于RocketMQ是基于主题的订阅模式,消息消费是针对主题进行的,如果直接遍历CommitLog文件来检索消息会非常低效。因此,ConsumeQueue作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量、消息大小和消息Tag的HashCode值。
- 组织形式:
- ConsumeQueue文件夹的组织方式为
topic/queue/file
三层组织结构,具体存储路径为${HOME}/store/consumequeue/{topic}/{queueId}/{fileName}
。 - ConsumeQueue文件采取定长设计,每个条目共20个字节,分别为8字节的CommitLog物理偏移量、4字节的消息长度、8字节Tag的HashCode值。
- 单个文件由30万个条目组成,文件大小约5.72MB。当单个文件写满后,会继续写入下一个文件中。
- ConsumeQueue文件夹的组织方式为
3. IndexFile文件
- 作用:IndexFile是索引文件,提供了一种可以通过key或时间区间来查询消息的方法,用于加速消息的检索性能。
- 组织形式:
- Index文件的存储位置为
${HOME}/store/index/{fileName}
,文件名fileName是以创建时的时间戳命名的。 - 固定的单个IndexFile文件大小约为400M,一个IndexFile可以保存2000万个索引。
- IndexFile的文件结构分为三部分:IndexHeader(40个字节)、Hash槽(默认一个index文件包含500万个Hash槽,每个Hash槽占4个字节)和Index条目列表(默认一个index文件包含2000万个条目)。每个Index条目记录key的HashCode、消息对应的CommitLog offset、消息存储时间与第一条消息存储时间的差等信息。
- IndexFile的底层存储设计为在文件系统中实现HashMap结构,因此RocketMQ的索引文件其底层实现为hash索引。
- Index文件的存储位置为
综上所述,RocketMQ通过CommitLog、ConsumeQueue和IndexFile三类文件的有机结合,实现了消息的高效存储与检索。这种混合型的存储结构不仅确保了消息发送的高性能与高吞吐量,还提高了消息消费的效率和灵活性。