当前位置: 首页 > 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.lryc.cn/news/573449.html

相关文章:

  • verilog HDLBits刷题“Module cseladd”--模块 cseladd---Carry-select adder 进位选择adder
  • 为车辆提供路径规划解决方案:技术演进、挑战与未来蓝图
  • 【appium】2.初始连接脚本配置
  • C++模板基础
  • 【AGI】突破感知-决策边界:VLA-具身智能2.0
  • 用OBS Studio录制WAV音频,玩转语音克隆和文本转语音!
  • 《揭开CSS渲染的隐秘角落:重排与重绘的深度博弈》
  • 【StarRocks系列】查询优化
  • 操作系统进程与线程核心知识全览
  • 前端开发面试题总结-vue3框架篇(二)
  • 钉钉智能会议室集成指纹密码锁,临时开门密码自动下发
  • 前端登录不掉线!Vue + Node.js 双 Token 无感刷新方案
  • 爱高集团引领转型浪潮:AI与区块链驱动香港科技资本新机遇
  • [C++] STL数据结构小结
  • Linux——Json
  • 【系统分析师】2017年真题:综合知识-答案及详解
  • JVM(8)——详解分代收集算法
  • 【基础算法】贪心 (一) :简单贪心
  • Python标准库 zlib模块【数据压缩/解压】全面讲解
  • Python元组常用操作方法
  • 什么是跨域问题?后端如何解决跨域问题?
  • MCU量产高效烧录:BootLoader与App合并技巧
  • 【Python】正则表达式中的`^`和`[]`
  • 学c++ cpp 可以投递哪些岗位
  • 从0开始学习计算机视觉--Day02--数据驱动
  • MySQL误删数据急救指南:基于Binlog日志的实战恢复详解
  • Mac Parallels Desktop Kali 2025 代理设置
  • OpenAI与微软的未来合作之路:充满挑战的AI竞赛与共赢
  • YAML 数据格式详解
  • 计算机网络第九章——数据链路层《流量控制和可靠传输》