关于rocketmq:RocketMQ-消息消费队列与索引文件

42次阅读

共计 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 则会构建索引键,再写入数据。

正文完
 0