RocketMq存储结构(CommitLog、ConsumeQueue、IndexFile)

RocketMq存储结构(CommitLog、ConsumeQueue、IndexFile),第1张

RocketMq存储结构(CommitLog、ConsumeQueue、IndexFile)

在RocketMq存储架构设计中,采用的是混合存储(多个Topic的消息实体内容都存储于一个CommitLog中),其中有3个重要的存储文件,分别是CommitLog、ConsumeQueue、IndexFile

(1)CommitLog

CommitLog是存储消息的主体。Producer发送的消息都会顺序写入commitLog文件,所以随着写入的消息增多,文件也会随之变大。单个文件大小默认1G, 文件名长度为20位,左边补零,剩余为起始偏移量,比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1073741824;当第一个文件写满了,第二个文件为00000000001073741824,起始偏移量为1073741824,以此类推。
存储路径: $HOME/storte/commitLog

(2)ConsumeQueue

ConsumeQueue(逻辑消费队列)可以看成基于topic的commitLog的索引文件。因为CommitLog是按照顺序写入的,不同的topic消息都会混淆在一起,而Consumer又是按照topic来消费消息的,这样的话势必会去遍历commitLog文件来过滤topic,这样性能肯定会非常差,所以rocketMq采用ConsumeQueue来提高消费性能。即每个Topic下的每个queueId对应一个Consumequeue,其中存储了单条消息对应在commitLog文件中的物理偏移量offset,消息大小size,消息Tag的hash值。存储路径:$HOME/store/consumequeue/{topic}/{queueId}/{fileName}

   (3)IndexFile

IndexFile提供了一种可以通过key(topic+msgId)或时间区间来查询消息的方法。他的存在主要是针对在客户端(生产者和消费者)和控制台接口提供了根据key查询消息的实现。为了方便用户查询具体某条消息。IndexFile的存储结构可以认为是一个hashmap。
存储路径:HOMEstoreindexHOMEstoreindex{fileName}
文件名fileName是以创建时的时间戳命名的

现在来看这张图就很清晰了


(1)单个broker实例中,所有队列共享一个commitlog,所有消息都顺序写入commitlog

(2)消费者读取消息时,先读取consumerQueue,然后再通过commitLog中拿到消息主体

参考文章:

docs/cn/design.md · Apache/RocketMQ - Gitee.com
RocketMQ-消息存储基本架构及存储流程_hosaos的博客-CSDN博客_rocketmq存储
浅析ComsumeQueue和IndexFile对RocketMQ的作用_cjdjcdj的博客-CSDN博客

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5653500.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存