当前位置: 首页 > news >正文

RocketMQ--为什么性能不如Kafka?

原文网址:RocketMQ--为什么性能不如Kafka?-CSDN博客

简介

本文介绍RocketMQ为什么性能不如Kafka?

阿里中间件团队对它们做过压测,同样条件下,kafka 比 RocketMQ 快 50% 左右。

为什么 RocketMQ 参考了 Kafka 的架构,却不能跟 kafka 保持一样的性能呢?

读消息的方式

为了防止消息队列的消息丢失,一般不会放内存里,而是放磁盘上。消息从消息队列的磁盘,发送到消费者,过程是怎样的呢?

传统方式(比如:RabbitMQ)

如果用户想要将数据从磁盘发送到网络。那么就会发生下面这几件事:

程序会发起系统调用read(),尝试读取磁盘数据:

  • 磁盘数据从设备拷贝到内核空间的缓冲区
  • 再从内核空间的缓冲区拷贝到用户空间

程序再发起系统调用write(),将读到的数据发到网络:

  • 数据从用户空间拷贝到 socket 发送缓冲区
  • 再从 socket 发送缓冲区拷贝到网卡

最终数据就会经过网络到达消费者。

整个过程,本机内发生了 2 次系统调用,对应 4 次用户空间和内核空间的切换,以及 4 次数据拷贝

上边传统方式一份数据来回拷贝,有没有办法优化呢?有:零拷贝技术,常见的方案有两种,分别是 mmap 和 sendfile。

零拷贝(mmap)

RocketMQ用的是mmap方式。

mmap 是操作系统内核提供的一个方法,可以将内核空间的缓冲区映射到用户空间。

用了它,发送流程就有了变化。程序发起系统调用mmap(),尝试读取磁盘数据,具体情况如下:

  • 磁盘数据从设备拷贝到内核空间的缓冲区。
  • 内核空间的缓冲区映射到用户空间,这里不需要拷贝。

程序再发起系统调用write(),将读到的数据发到网络:

  • 数据从内核空间缓冲区拷贝到 socket 发送缓冲区。
  • 再从 socket 发送缓冲区拷贝到网卡。

发生了 2 次系统调用,对应 4 次用户空间和内核空间的切换,以及 3 次数据拷贝,对比之前,省下一次内核空间到用户空间的拷贝。 

不是说零拷贝吗,怎么还有 3 次拷贝?mmap 作为一种零拷贝技术,指的是用户空间到内核空间这个过程不需要拷贝,而不是指数据从磁盘到发送到网卡这个过程零拷贝。

确实省了一点,但不多。有没有更彻底的零拷贝?有,用 sendfile。

零拷贝(sendfile)

全文见:RocketMQ-为什么性能不如Kafka? - 自学精灵

http://www.lqws.cn/news/462817.html

相关文章:

  • 黑马头条-数据管理平台
  • Codeforces Round 1028 (Div. 2) A-C
  • ByteMD Markdown编辑器详细解释修改编辑器默认样式(高度300px)
  • Sublime text启用vim
  • 力扣刷题(第六十四天)
  • 咨询大师——解读96页麦肯锡金字塔原理【附全文阅读】
  • Qt输入数据验证的方法
  • 服务器架构---三高是什么
  • Ruby 范围(Range)
  • 如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
  • DM8故障分析工具-AWR报告
  • PY32学习(2)-搭建Keil环境
  • 基于SpringBoot+Uniapp的活动中心预约小程序(协同过滤算法、腾讯地图、二维码识别)
  • Linux 内核中 TCP 协议栈的输出实现:tcp_output.c 文件解析
  • 蓝牙数据通讯,实现内网电脑访问外网电脑
  • 针对机器人自修复材料的具体推荐及特性分析
  • STM32 CAN简介及帧格式
  • 操作系统内核态和用户态--1-基础认识
  • [Github]GitHub 2FA快速安全配置全攻略
  • 解决SQL映射文件的警告提示
  • Vue 3 + Axios 完整入门实战指南
  • Docker学习笔记:DockerFile
  • XCVU47P-2FSVH2892E Xilinx Virtex UltraScale+ FPGA AMD
  • 解锁K-近邻算法:数据挖掘的秘密武器
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 04(题目+回答)
  • Python 数据分析与可视化 Day 3 - Pandas 数据筛选与排序操作
  • 当数据自己会说话:聚类与分类算法全景解析
  • 大模型在急性弥漫性腹膜炎预测及治疗方案制定中的应用研究
  • springboot口腔管理平台
  • CSS 动画:深入解析与高效实践