2

在store目录下,除了commilog目录,还有consumequeue和index目录。

consumequeue是消息消费队列存储目录,比如我们建了一个TopicTest,有四个MessageQueue,那在consumequeue目录下,就有一个TopicTest目录,TopicTest目录下还有0,1,2,3四个目录,对应着MessageQueue的个数。这些数字的下面的文件,就是实际上的数据。

前面已经讲了消息都是落在了commitlog日志文件中,我们消费的时候,却是根据topic来的,如果需要一个个的从commitlog日志文件中遍历某一个topic,那这个效率就非常低下了,所以就有了一个ConsumeQueue来记录每一个topic在commitlog的位置。

另外一个index是消息索引文件存储目录,通过Hash索引机制为消息建立索引,RocketMQ会将消息索引键与消息偏移量映射关系写入到IndexFile。

既然ConsumeQueue和IndexFile都是关联着commilog日志文件,那我们写入commitlog日志文件的时候,ConsumeQueue和IndexFile是什么时候写入的呢?

image.png

broker启动的时候,还会启动一个线程,叫做ReputMessageService,负责把commitlog日志的更新事件传播出去,他记录commitlog从哪个偏移量开始转发消息给ConsumeQueue和IndexFile。

image.png

每隔1ms,这个线程就会通过偏移量去commitlog日志文件里看看是否有新的消息进来,如果有,就会把消息进行转发,由于需要写入ConsumeQueue和IndexFile,所以这里就有两个转发器。

image.png

CommitLogDispatcherBuildConsumeQueue会根据topic以及队列的ID,获取对应的ConsumeQueue文件(可以参考上面的目录树),把数据写入其中。

CommitLogDispatcherBuildIndex则会构建索引键,再写入数据。

image.png


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆