我们都知道, 为了防止消息在服务器丢失, 一般都是进行持久化(保存在磁盘), 在发送消失时那就涉及到从磁盘拷贝到内核空间, 从内核空间到用户态, 再从用户态到socket缓存区, 从socket缓存区到网卡 四次拷贝。
kafka使用的是零拷贝-sendfile, 把内核态数据发送到网卡, 减少两次拷贝,
而rocketmq使用的是零拷贝-mmp, 把内核态数据映射到用户态, 只减少一次拷贝,
所以kafka吞吐量会大一些。
为什么rocketmq要用mmp?
因为mmp 在用户态的应用程序可以读到 消息内容 并做一些额外功能(把消息加到死信队列, 补发消息)。
这是用sendfile不行的
总结:没有完美的架构, 很难做到既要, 又要, 牺牲一部分能力换取另一部分, 从而适应不同场景需求
传统文件传输
mmp (映射 减少一次拷贝 rocketmq用了)
sendfile(kafka用了)
图来源于 小林coding 参考: 9.1 什么是零拷贝? | 小林coding