开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):存储文件内存映射-MappedFileQueue】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12480
存储文件内存映射-MappedFileQueue
内容介绍:
一.存储文件内存映射
二.MappedFileQueue
一.存储文件内存映射
存储文件的内存映射。RocketMQ 将消息进行持久化的时候,主要用到了几个目录进行消息的存储,比如 CommitLog 里面每一个文件其实都是存储的消息的源数据,
Consumerqueue 其实是为了进行消息的检索,这里面存储了相当于消息的索引信息,使用它可以快速找到 CommitLog 中的数据,index 是专门的比如根据消息的属性进行索引时,索引信息在这里面进行存储。
RocketMQ 使用了内存映射技术提高了 IO 访问性能,为了使用内存映射,无论对于 CommitLog、Consumerqueue 以及 indexFile,这三类不同的文件都被设计为固定的长度,当一个文件写满之后再创建另外一个新的文件,以文件名作为第一条消息对应的全局物理偏移量。使用内存映射主要的原因,就是提高 IO 访问的性能。我们会看到 CommitLog、Consumerqueue 以及indexFile,它们都是一些固定大小的文件。
其中 CommitLog 每一个的大小都是1G, Consumerqueue 以主题为文件夹名字,这里面分别设置了消息队列对应的存储文件,每一个都是5.72,对于索引的文件大小都是400兆,这些设置的目的都是为了更好地使用内存映射的技术,提高文件的 IO 访问性能。
分别看一下内存映射相关的一些重要的类。
二.MappedFileQueue
第一个是 MappedFileQueue,这个类相当于 CommitLog 中的一个文件的队列,可以将其当做 CommitLog 的目录。这个类中重要的属性第一个是 storePath,是当前 CommitLog 目录的绝对磁盘路径。第二个 mappedFileSize,是每一个消息存储文件的大小,这个数据默认的是1024M(1G)。这里面还有一个集合CopyOnWriteArrayList<MappedFile> mappedFiles 就是文件的集合。还有一个专门的服务类,该服务类的作用主要是创建 MappedFile,当一个文件写满之后,会使用该服务类创建一个新的文件。这里面还存储了当前刷盘指针(flushedwhere = 0)以及当前数据提交的指针(committedwhere = 0)。这是MappedFileQueue 这个类的一些重要属性。在这个类中提供了很多查找MappedFile 的方法。
比如根据时间进行查找,这叫做 getMappedFileByTime,这个方法提供了以时间查找最后进行操作的MappedFile 的文件。还有根据消息偏移量查找,还有查找最小偏移量,根据查找某一个文件的最小偏移量,还有获取存储文件的最大偏移量以及返回存储文件当前的指针,这些方法都是该类中主要的一些方法。在 RocketMQ 中为了提高文件的 IO 访问性能,用到了内存映射的技术,第一个重要的类就是MappedFileQueue,它对应的是 CommitLog 的文件的队列。