RocketMQ 主要的存储文件包含commitlog、consumequeue、IndexFile。其文件布局如下:

RocketMQ存储设计-Commitlog文件
Commitlog文件格式

消息存储文件:所有主题的消息随着到达Broker的顺序写入commitlog文件,每个文件默认为1G,文件的命名也及其巧妙,使用该存储在消息文件中的第一个全局偏移量来命名文件,这样的设计主要是方便根据消息的物理偏移量,快速定位到消息所在的物理文件。RocketMQ commitlog文件使用顺序写,极大提高了文件的写性能。
ConsumeQueue文件格式

**ConsumeQueue文件:消息消费队列文件,是Commitlog文件的基于Topic的索引文件,主要用于消费者根据Topic消费消息,其组织方式为/topic/queue,同一个队列中存在多个文件,consumequeue设计极具技巧性,其每个条目使用固定长度(8字节commitlog物理偏移量、4字节消息长度、8字节tag hashcode)**,这里不是存储tag的原始字符串,而是存储hashcode,目的就是确保每个条目的长度固定,可以使用访问类似数组下标的方式来快速定位条目,极大的提高了ConsumeQueue文件的读取性能,试想一下,消息消费者根据topic、消息消费进度(consumeuqe逻辑偏移量),即第几个Consumeque条目,这样根据消费进度去访问消息的方法为使用逻辑偏移量logicOffset*20即可找到该条目的起始偏移量(consumequeue文件中的偏移量),然后读取该偏移量后20个字节即得到了一个条目,无需遍历consumequeue文件。
1、consumequeue文件引入的目的?
2、consumequeue文件存储tag hashcode而不是存储tag字符串的原因?
网友评论