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

kafka rocketmq 零拷贝

kafka & rocketmq 零拷贝

  1. 零拷贝
传统意义上拷贝
 
 
mmap()内存映射, rocketmq的读数据以及kafka的写索引数据均采用此方式
 
sendfile()
 
sendfile() + DMA gather copy。kafka 读数据采用此方式
 
splice() + DMA copy
 
 
 
使用 mmap + write 方式
 
RocketMQ 选择了这种方式,mmap+write 方式,因为有小块数据传输的需求,效果会比 sendfile 更好。但是RocketMQ控制mmap映射的内存分配与释放的地方非常复杂,稍有不慎就会出问题。
 
优点:即使频繁调用,使用小块文件传输,效率也很高。
 
缺点:不能很好的利用 DMA 方式,会比 sendfile 多消耗 CPU,内存安全性控制复杂,需要避免 JVM Crash问题。
 
2. 使用 sendfile 方式
 
优点:可以利用 DMA 方式,消耗 CPU 较少,大块文件传输效率高,无内存安全性问题。
 
缺点:小块文件效率低于 mmap 方式,只能是 BIO 方式传输,不能使用 NIO。
 
sendfile:FileChannel.transferTo()只有源为FileChannel才支持transfer这种高效的复制方式,其他如SocketChannel都不支持transfer模式。当然,目的Channel没有这种限制。所以一般可以做FileChannel->FileChannel和FileChannel->SocketChannel的transfer。
 
KAFKA的索引文件使用mmap+write 方式,data文件使用sendfile 。
 
下面这个问题就是RocketMQ使用mmap后的潜在问题:
 
 
 
为什么 RocketMQ 不使用 sendfile?参考 Kafka 抄个作业也不难啊?我们来看下 sendfile 函数长啥样:
 
c ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count); // num = sendfile(xxx);
 
  • RocketMQ:使用 mmap 技术进行零拷贝,返回的是数据的具体内容,应用层可以获取消息内容并进行一些逻辑处理。我们来看下 mmap 函数长啥样:
c void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); // buf = mmap(xxx)
 
注释里写的是两个函数的用法,mmap 返回的是数据的具体内容,应用层能获取到消息内容并进行一些逻辑处理。而 sendfile 返回的则是发送成功了几个字节数,具体发了什么内容,应用层根本不知道。
 
RocketMQ 的一些功能需要了解具体这个消息内容,方便二次投递等,比如将消费失败的消息重新投递到死信队列中。如果 RocketMQ 使用 sendfile,那根本没机会获取到消息内容长什么样子,也就没办法实现一些好用的功能了。而 Kafka 却没有这些功能特性,追求极致性能,正好可以使用 sendfile
 
http://www.vanclimg.com/news/2652.html

相关文章:

  • 12N90-ASEMI电源逆变器专用12N90
  • 淀粉质(点分治)总结
  • MATLAB的图像融合方法:IHS、PCA、拉普拉斯、PCNN、小波
  • 基于YOLOv8的有无戴安全帽检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
  • 测试
  • IDEA Plugins:通义灵码
  • 平衡树
  • Windows 平台的路由表配置
  • 怎么使用德布鲁因序列编码三色激光条纹?
  • BSC链验证者更新机制深度解析:Epoch、Snapshot与实时控制 - 若
  • Iron Software:助力.NET开发者轻松实现文档和图像处理功能
  • 通过对二维地震模拟中有限差分法进行模拟,实现地震合成记录
  • Three.js 的第一个工程-添加文本
  • Random
  • SLF4J Logback Log4j, Log4j2
  • 理解非线性市值因子NLSIZE/MIDCAP
  • 杜教筛
  • Java核心类——3.StringJoiner
  • Messager 详解:WPF 中的消息传递与数据绑定入门指南
  • Fastmcp 案例五(Cherry Studio调式 ,结合案例四)
  • Unity加载资源的方式
  • IMA-Appraisal HASH fix mode和enforce mode的解释
  • C# Avalonia 06 - Controls- MediaElement
  • 学习笔记《莫比乌斯反演》
  • 惯性导航+DVL的组合导航算法
  • CVE-2016-5385 CGI 应用环境变量注入漏洞 (复现)
  • spring和Mybatis的逆向工程
  • 解决keil使用UTF-8乱码问题,兼容UTF-8编码,但keil显示不乱码的解决方案
  • 解决MySQL删除/var/lib/mysql下的所有文件后无法启动的问题
  • godot 二维报表库