0
点赞
收藏
分享

微信扫一扫

RocketMQ基于MMAP的零拷贝技术方案

栖桐 2022-05-05 阅读 81
中间件

先来一张RocketMQ接受数据拷贝时的示意图:
在这里插入图片描述

老版本RocketMQ在进行数据接入和接出的时候,操作系统会先将数据读到内存中,然后MQ应用在讲数据读到应用层中,对数据进行处理,进行持久化时候,也会将数据先写进文件缓冲区,然后再写入文件中去。
为了提高性能,新版本对持久化部分进行一个升级,开辟了一块MappedByteBuffer(磁盘映射区域),用来直接对硬盘进行操作,省去了cpu拷贝进缓冲区的操作。节省了很大的资源开销。像这种创建磁盘映射的实现,我们称之为MMAP。而这种通过直接操作硬盘的行为实现性能缩减的技术,我们统称为零拷贝技术
对于资源开销方面的问题,我们可以看到,流程中只有两种拷贝方式,DMA拷贝和CPU拷贝,由于两者性质的不同,我们假设DMA拷贝需要2ms的话,CPU拷贝大约需要200ms,虽然看起来RocketMQ只做了一步拷贝的省略,但是资源开销减少了近一半。
当然,零拷贝技术不仅仅是RocketMQ一家独有的技术,也不仅仅只有MMAP一种零拷贝技术。像Kafka也有自己的零拷贝方案:Sendfile。Sendfile是通过直接操作磁盘上文件的方式进行零拷贝实现的,但是这种实现有一个弊端,就是只能获取到文件的描述信息,无法真正的在应用层获取到实际的数据,因此kafka无法对数据进行进一步的处理,比如过滤等等。因此kafka有很大的局限性。

举报

相关推荐

0 条评论