一、看前提问:
二、消息存储:
- 原理图解:
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文件
零拷贝:
这是查询高效的原因
刷盘机制:
同步刷盘:
优点:可靠性高、安全性高
缺点:性能低
异步刷盘:
优点:效率高,吞吐量大
缺点:可靠性不能保证