Kafka 性能为什么比RocketMQ 高
一、引言在消息队列范畴,Kafka 和 RocketMQ 都是备受关注的产品。RocketMQ 参考了 Kafka 的设计思绪,在简化架构的同时丰富了功能。然而,尽管 RocketMQ 看起来功能强盛,但 Kafka 始终在市场中占据重要地位且未被镌汰。此中一个关键因素便是性能,本文将深入探究 Kafka 性能为何高于 RocketMQ,以及背后涉及的关键技能 —— 零拷贝技能。
二、性能数据对比
性能指标中的吞吐量数据体现,RocketMQ 每秒能处理 10 万量级的数据,而 Kafka 则能达到 17 万量级。这表明在吞吐量方面,Kafka 的性能更为强劲。
三、零拷贝技能详解
3.1 传统数据传输过程
在消息队列场景中,消息通常存储在磁盘以防止历程瓦解时丢失。当消息从消息队列磁盘发送到消耗者时,传统的数据传输过程如下:
[*]用户空间与内核空间:操作系统分为用户空间和内核空间,步伐处于用户空间,磁盘属于硬件设备,需通过操作系统调用硬件本领。
[*]数据传输步骤:
[*]步伐发起系统调用 read,将磁盘数据从设备拷贝到内核空间的缓冲区。
[*]数据再从内核空间的缓冲区拷贝到用户空间。
[*]步伐发起系统调用 write,将数据从用户空间拷贝到 socket 发送缓冲区。
[*]数据从 socket 发送缓冲区拷贝到网卡,终极经网络到达消耗者。
https://i-blog.csdnimg.cn/direct/261c7e1c476f4c6b81f53ce6e613fa7e.png
3.传统传输的弊端:
整个过程在本机内发生了两次系统调用,对应 4 次用户空间和内核空间的切换,以及 4 次数据拷贝。这种多次的数据拷贝导致效率低下。
3.2 mmap 零拷贝技能
3.2.1 mmap 原理
mmap 是操作系统内核提供的一个方法,它可以将内核空间的缓冲区映射到用户空间。使用 mmap 后,数据发送流程发生如下变化:
[*]步伐发起系统调用 mmap,将磁盘数据从设备拷贝到内核空间的缓冲区,并映射到用户空间(此步无需数据拷贝)。
[*]步伐发起系统调用,将数据从内核空间缓冲区拷贝到 socket 的发送缓冲区。
[*]数据从 socket 缓冲区发送到网卡。
https://i-blog.csdnimg.cn/direct/9006e62a5fe3467cbd2de9fa4312c1c1.png
3.2.2 mmap 优势与不敷
整个过程发生了两次系统调用,对应 4 次用户空间和内核空间的切换以及 3 次数据拷贝,相比传统方式省下了一次内核空间到用户空间的拷贝。但需要注意的是,mmap 所说的 “零拷贝” 是指用户空间到内核空间这个过程不需要拷贝,并非数据从磁盘发送到网卡的整个过程没有拷贝。
3.3 sendfile 零拷贝技能
3.3.1 sendfile 原理
sendfile 同样是内核提供的方法,从名字可看出是用于发送文件数据。其数据传输过程如下:
[*]步伐发起系统调用 sendfile,内核将数据从磁盘设备拷贝到内核空间的缓冲区。
[*]内核空间缓冲区里的数据可以直接拷贝到网卡。
https://i-blog.csdnimg.cn/direct/bda6a8f4239b41a88098fb6cbddfd589.png
上图红色字体的过程为改进点。它把数据描述信息读到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 的原因
[*]函数特性差别:
[*]MMAP 函数返回的是数据的具体内容,应用步伐可以或许获取到消息内容并举行逻辑处理。
[*]sendfile 函数返回的则是成功发送的字节数,应用层无法得知具体发送的内容。
[*]RocketMQ 功能需求:RocketMQ 的一些功能,如将消耗失败的消息重新投递到死信队列中,需要了解具体的消息内容。假如 RocketMQ 使用 sendfile,将无法获取消息内容,进而无法实现这些功能。而 Kafka 没有此类对消息内容深度处理的功能特性,更专注于追求极致性能,所以可以使用 sendfile 技能。
五、Kafka 高性能的其他因素
除了零拷贝技能,Kafka 高性能还得益于其他一些优化本领,比方数据压缩等。这些优化本领 RocketMQ 也可以或许借鉴。但在零拷贝技能的选择上,由于各自功能特性的差别,RocketMQ 无法采用 Kafka 所使用的 sendfile 技能。
六、Kafka 和 RocketMQ 的选择建议
经常有人询问 Kafka 和 RocketMQ 该怎样选择。从实际应用场景出发,假如是大数据场景,频繁涉及到如 Spark、Flink 等关键词时,建议使用 Kafka。而在其他场景下,优先选择 RocketMQ。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]