Kafka 性能为什么比RocketMQ 高

一、引言

在消息队列领域,Kafka 和 RocketMQ 都是备受关注的产品。RocketMQ 参考了 Kafka 的设计思路,在简化架构的同时丰富了功能。然而,尽管 RocketMQ 看起来功能强大,但 Kafka 始终在市场中占据重要地位且未被淘汰。其中一个关键因素便是性能,本文将深入探讨 Kafka 性能为何高于 RocketMQ,以及背后涉及的关键技术 —— 零拷贝技术。

二、性能数据对比

性能指标中的吞吐量数据显示,RocketMQ 每秒能处理 10 万量级的数据,而 Kafka 则能达到 17 万量级。这表明在吞吐量方面,Kafka 的性能更为强劲。

三、零拷贝技术详解

3.1 传统数据传输过程

在消息队列场景中,消息通常存储在磁盘以防止进程崩溃时丢失。当消息从消息队列磁盘发送到消费者时,传统的数据传输过程如下:

  1. 用户空间与内核空间:操作系统分为用户空间和内核空间,程序处于用户空间,磁盘属于硬件设备,需通过操作系统调用硬件能力。
  2. 数据传输步骤
    • 程序发起系统调用 read,将磁盘数据从设备拷贝到内核空间的缓冲区。
    • 数据再从内核空间的缓冲区拷贝到用户空间。
    • 程序发起系统调用 write,将数据从用户空间拷贝到 socket 发送缓冲区。
    • 数据从 socket 发送缓冲区拷贝到网卡,最终经网络到达消费者。

Kafka 性能为什么比RocketMQ 高_第1张图片

3.传统传输的弊端

整个过程在本机内发生了两次系统调用,对应 4 次用户空间和内核空间的切换,以及 4 次数据拷贝。这种多次的数据拷贝导致效率低下。

3.2 mmap 零拷贝技术

3.2.1 mmap 原理

mmap 是操作系统内核提供的一个方法,它可以将内核空间的缓冲区映射到用户空间。使用 mmap 后,数据发送流程发生如下变化:

  1. 程序发起系统调用 mmap,将磁盘数据从设备拷贝到内核空间的缓冲区,并映射到用户空间(此步无需数据拷贝)。
  2. 程序发起系统调用,将数据从内核空间缓冲区拷贝到 socket 的发送缓冲区。
  3. 数据从 socket 缓冲区发送到网卡。

Kafka 性能为什么比RocketMQ 高_第2张图片

3.2.2 mmap 优势与不足

整个过程发生了两次系统调用,对应 4 次用户空间和内核空间的切换以及 3 次数据拷贝,相比传统方式省下了一次内核空间到用户空间的拷贝。但需要注意的是,mmap 所说的 “零拷贝” 是指用户空间到内核空间这个过程不需要拷贝,并非数据从磁盘发送到网卡的整个过程没有拷贝。

3.3 sendfile 零拷贝技术

3.3.1 sendfile 原理

sendfile 同样是内核提供的方法,从名字可看出是用于发送文件数据。其数据传输过程如下:

  1. 程序发起系统调用 sendfile,内核将数据从磁盘设备拷贝到内核空间的缓冲区。
  2. 内核空间缓冲区里的数据可以直接拷贝到网卡。

Kafka 性能为什么比RocketMQ 高_第3张图片

上图红色字体的过程为改进点。它把数据描述信息读到socket的缓冲区中,DMA Gather Copy根据socket缓冲的数据描述信息批量的从pageCache中读取到网卡设备上。至此剩余的一次pageCache到socket缓冲的cpu拷贝也被节省掉了。

3.3.2 sendfile 优势

整个过程仅发生了一次系统调用,对应两次用户空间和内核空间的切换,以及两次数据拷贝。这里所说的 “零拷贝” 指的是 0 CPU 拷贝,在 sendfile 场景下需要的两次拷贝都是由 DMA 控制器完成,不占用 CPU 资源,不耽误 CPU 运行其他程序。

四、Kafka 与 RocketMQ 性能差异原因

RocketMQ 使用的是 MMAP 技术,而 Kafka 使用的是 sendfile 技术。由于 sendfile 技术在系统调用次数以及系统内核切换次数上的优势,使得 Kafka 获得了更高的性能。

4.1 RocketMQ 不使用 sendfile 的原因

  1. 函数特性差异
    • MMAP 函数返回的是数据的具体内容,应用程序能够获取到消息内容并进行逻辑处理。
    • sendfile 函数返回的则是成功发送的字节数,应用层无法得知具体发送的内容。
  2. RocketMQ 功能需求:RocketMQ 的一些功能,如将消费失败的消息重新投递到死信队列中,需要了解具体的消息内容。如果 RocketMQ 使用 sendfile,将无法获取消息内容,进而无法实现这些功能。而 Kafka 没有此类对消息内容深度处理的功能特性,更专注于追求极致性能,所以可以使用 sendfile 技术。

五、Kafka 高性能的其他因素

除了零拷贝技术,Kafka 高性能还得益于其他一些优化手段,例如数据压缩等。这些优化手段 RocketMQ 也能够借鉴。但在零拷贝技术的选择上,由于各自功能特性的差异,RocketMQ 无法采用 Kafka 所使用的 sendfile 技术。

六、Kafka 和 RocketMQ 的选择建议

经常有人询问 Kafka 和 RocketMQ 该如何选择。从实际应用场景出发,如果是大数据场景,频繁涉及到如 Spark、Flink 等关键词时,建议使用 Kafka。而在其他场景下,优先选择 RocketMQ。

你可能感兴趣的:(MQ)