rocketMq存储模型_consumeQueue

在前面的文章中,已经说过RocketMq中一个topic对应了多个queue,生产者发送的消息会默认以轮询的方式发到不同的queue中,对应到文件系统中,就是一个topic下的多组consumequeue文件

通过上一篇文章,你应该已经知道了,消息正文存在commitLog中,consumequeue文件中存的是索引,索引的key为消费位点,内容为消息在commitLog中的位置信息。consumequeue文件的结构非常简单,就是由30万个固定大小为20byte的的数据块组成,数据块的内容如下:

内容非常明确,只要能定位到数据块,就能根据块中内容定位到消息在commitLog文件中的起始位置以及tag信息,下面看看索引查询以及构建

查询:

上一篇说过,consumequeue的索引key是消费位点,是个从1开始递增的数字,通过消费位点对consumequeue文件大小(30万)取余,可以定位到指定的consumequeue文件以及在该文件中的数据块,比如位点1对应第1个consumequeue的第1个数据块,位点31万对应第2个consumequeue文件的第1万个数据块,因为数据块大小固定,所以可以算出对应的数据块在文件中的偏移量,然后就可以读到消息的位置信息,完成一次查询过程

构建:

broker启动时,会启动一个ReputMessageService任务,1毫秒运行一次,该任务会构建consumequeue索引,ReputMessageService维持一个commitLog文件中消息偏移量reputFromOffset,根据该偏移量读取对应的消息,然后将其位置信息追加写到consumequeue文件中,完成一条消息的索引构建过程;之后设置reputFromOffset=reputFromOffset+读取到的消息.size,继续下一条消息的索引构建

猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/106234406