rockmq 存储过程分析
1 存储篇
1.1 整体结构
存储层的结构如下图所示,业务层均通过DefaultMessageStore类提供的方法作为统一入口访问底层文件。RocketMQ底层有6类文件,对于不同类型的文件在存储逻辑层采用不同的类提供服务,其中三类大文件:Index文件由IndexService类提供服务,consumequeue文件由Consumequeue类提供服务,commitlog文件由CommitLog类提供服务,还有两类小文件:checkpoint文件由StoreCheckPoint类提供访问服务、config目录下面的配置文件(以json格式存储)由ConfigMananger类提供访问服务;
对于index/consumequeue/commitlog这三类大文件,为了提供读写性能,底层采用java.nio.MappedByteBuffer类,该类是文件内存映射方案,支持随机读/顺序写操作,为了便于存储逻辑层操作大文件,将该类封装成MapedFile类;对于每类大文件,在存储时分隔成多个固定大小的文件,其中每分隔的文件的文件名为前面所有文件的大小+1,即为文件的起始偏移量,从而实现了整个大文件的串联,每个固定大小的文件均由MapedFile类提供操作服务;MapedFile类提供了顺序写、随机读、内存数据刷盘、内存清理等与文件相关的服务。
文件内存映射概念:
1.2 大文件的磁盘操作——MapedFile
对于commitlog、consumequeue、index三类大文件进行磁盘读写操作,均是通过MapedFile类来完成。该类的成员变量如下图所示,就是映射文件的属性信息;
采用mmap直白得表诉 是讲 文件通过虚拟内存映射到物理内存。进程对文件得操作,直接操作内存。后续 定时刷盘。减少了io操作得频率。
和普通得文件读写 得区别是,1内存级别文件操作 2普通得文件读写。数据先由磁盘读入到文件缓存中。
再把文件缓存中数据读到用户内存中。存在两次数据拷贝。效率低下。
rockmq 采取文件预热得原理。讲空数据写入到文件中。这样就会再内存中创建映射。否则只是建立文件到虚拟内存得映射。不到物理内存。这样产生缺页中断。需要临时去读取数据。
参考:
链接:https://www.jianshu.com/p/eaad6ec3f87c
原文链接:https://blog.csdn.net/meilong_whpu/article/details/76916759
mmap原理,参考https://blog.csdn.net/qq_33611327/article/details/81738195