一、看前提问:
二、消息存储:
- 原理图解:

2.存储介质:
物理文件进行持久化存储
3.顺序存储:
RocketMQ的消息⽤顺序写保证了消息存储的速度。
4.消息存储结构:
消息存储是consumerqueue和commitlog配合存储完成的
commitlog:真正存储消息的物理文件(${store}/commitlog)
consumerqueue:消息的逻辑队列,存储的是物理存储的地址类似索引。
consumerqueue:topic下每个messagequeue都有对应的consumerqueue文件,也是存在物理文件中路径为:…/consumequeue/{topicName}/{queueid}/fileNameBroker
mappedFile⽂件⽣成逻辑:
commitlog内部的数据结构,核心部分就是mappedFile(102410241024=1G/每个mappedFile),每个mappedFile生成逻辑都是名字长度为20左边补0,例如第一个为00000000000000000000,顺序读写满了第二个就是000000001073741824,具体可查询源码:
MessageStoreConfig类中mappedFileSizeCommitLog属性
MappedFileQueue类中getLastMappedFile方法
存储结构图:

commitlog与offset:

indexfile:
提供通过key或时间区间来查询消息的方法,文件的存储路径为: …\store\index${fileName},⽂件名fileName是以创建时的时间戳命名的,固定的单个IndexFile⽂件⼤⼩约为400M,⼀个IndexFile可以保存 2000W个索引,IndexFile的底层存储设计为在⽂件系统中实现HashMap结构,故rocketmq的索引⽂件其底层实现为hash索引
清理机制:
- 按时间清理:默认清理3天前的commitlog
- 按磁盘水位:磁盘容量达到75%开始清理最老的commitlog文件
零拷贝:
这是查询高效的原因
刷盘机制:
同步刷盘:

优点:可靠性高、安全性高
缺点:性能低
异步刷盘:

优点:效率高,吞吐量大
缺点:可靠性不能保证
RocketMQ采用顺序写保证消息存储速度,通过consumerqueue和commitlog配合存储,其中commitlog存储实际消息,consumerqueue存储物理地址作为索引。消息索引通过IndexFile实现,支持按时间或key查询。系统配置了按时间和磁盘水位的清理策略,同时提供了同步和异步刷盘模式以平衡性能和可靠性。零拷贝技术提升了查询效率。
1546

被折叠的 条评论
为什么被折叠?



