17

RocketMQ -- 消息消费队列与索引文件

 1 year ago
source link: https://segmentfault.com/a/1190000041576979
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

RocketMQ -- 消息消费队列与索引文件

发布于 3 月 20 日

在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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK