在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是什么时候写入的呢?
broker启动的时候,还会启动一个线程,叫做ReputMessageService,负责把commitlog日志的更新事件流传进来,他记录commitlog从哪个偏移量开始转发音讯给ConsumeQueue和IndexFile。
每隔1ms,这个线程就会通过偏移量去commitlog日志文件里看看是否有新的音讯进来,如果有,就会把音讯进行转发,因为须要写入ConsumeQueue和IndexFile,所以这里就有两个转发器。
CommitLogDispatcherBuildConsumeQueue会依据topic以及队列的ID,获取对应的ConsumeQueue文件(能够参考下面的目录树),把数据写入其中。
CommitLogDispatcherBuildIndex则会构建索引键,再写入数据。