所有分类
  • 所有分类
  • 未分类

RocketMQ–为什么性能好?

简介

本文介绍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其实就是预分配的请求,会提前准备好下一个文件的分配,防止在消息写入的过程中分配文件,产生抖动。 ​

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录