共计 863 个字符,预计需要花费 3 分钟才能阅读完成。
在 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 则会构建索引键,再写入数据。