简介
本文介绍RocketMQ为什么读写是在磁盘里,性能还这么好。
1.顺序读写
对磁盘读写时,如果是顺序读写,那么磁头几乎不用换道,或者换道的时间很短。读写效率会提高很多。(RocketMQ 是顺序写,读并不是,但是它的读机制类似顺序读)。
RocketMQ 将消息写入CommitLog 文件夹中的mappedFile文件(这个文件超过1G后会新建一个)时,是按照顺序写入的。不论消息属于哪个 Topic 的哪个 Queue 。都会按照顺序依次存储到CommitLog 文件夹中的mappedFile文件。

2.mmap零拷贝
RocketMQ对文件的读写操作是通过mmap零拷贝进行的,将对文件的操作转化为直接对内存地址进行操作,从而极大地提高了文件的读写效率。
mmap零拷贝详见:RocketMQ-为什么性能不如Kafka? – 自学精灵
3.预读取机制
队列中的数据是顺序存放的,还引入了PageCache的预读取机制,使得对队列文件的读取几乎接近于内存读取,即使在有消息堆积情况下也不会影响性能。
若用户要读取数据,其首先会从PageCache中读取,若没有命中,则OS在从物理磁盘上加载该数据到PageCache的同时,也会顺序对其相邻数据块中的数据进行预读取。
4.文件预分配
CommitLog 的大小默认是1G,当超过大小限制的时候需要准备新的文件,而 RocketMQ 就起了一个后台线程 AllocateMappedFileService,不断的处理 AllocateRequest,AllocateRequest其实就是预分配的请求,会提前准备好下一个文件的分配,防止在消息写入的过程中分配文件,产生抖动。
请先
!