相似的架构,后起之秀 RocketMQ 为什么性能不如 Kafka?
零拷贝是什么
我们知道,消息队列的消息为了防止进程崩溃后丢失,一般不会放内存里,而是放磁盘上。那么问题就来了,消息从消息队列的磁盘,发送到消费者,过程是怎么样的呢?
消息的发送过程
操作系统分为 用户空间 和 内核空间 。程序处于用户空间,而磁盘属于硬件,操作系统本质上是程序和硬件设备的一个 中间层 。程序需要通过操作系统去调用硬件能力。
read()
,尝试读取磁盘数据,
- • 磁盘数据从设备 拷贝 到内核空间的缓冲区。
- • 再从内核空间的缓冲区 拷贝 到用户空间。
write()
,将读到的数据发到网络:
- • 数据从用户空间 拷贝 到 socket 发送缓冲区
- • 再从 socket 发送缓冲区 拷贝 到网卡。
最终数据就会经过网络到达消费者。
2
次
系统调用
,对应
4
次用户空间和内核空间的
切换
,以及
4
次数据
拷贝
。
mmap
和
sendfile
。我们来看下它们是什么。
mmap 是什么
mmap
是操作系统内核提供的一个方法,可以将内核空间的缓冲区
映射
到用户空间。
mmap()
,尝试读取磁盘数据,具体情况如下:
- • 磁盘数据从设备 拷贝 到内核空间的缓冲区。
- • 内核空间的缓冲区 映射 到用户空间,这里 不需要 拷贝。
write()
,将读到的数据发到网络:
- • 数据从内核空间缓冲区 拷贝 到 socket 发送缓冲区。
- • 再从 socket 发送缓冲区 拷贝 到网卡。
2
次系统调用,对应
4
次用户空间和内核空间的切换,以及
3
次数据拷贝,对比之前,省下
一次
内核空间到用户空间的拷贝。
sendfile
.
sendfile 是什么
sendfile
,也是内核提供的一个方法,从名字可以看出,就是用来
发送文件数据
的。程序发起
系统调用
sendfile()
,内核会尝试读取磁盘数据然后发送,具体情况如下:
- • 磁盘数据从设备 拷贝 到内核空间的缓冲区。
- • 内核空间缓冲区里的数据 可以 直接 拷贝 到网卡。
1
次系统调用,对应
2
次用户空间和内核空间的切换,以及
2
次数据拷贝。这时候问题很多的小明就有意见了,说好的
零
拷贝怎么还有
2
次拷贝?
kafka 为什么性能比 RocketMQ 好
聊完两种零拷贝技术,我们回过头来看下 kafka 为什么性能比 RocketMQ 好。这是因为 RocketMQ 使用的是 mmap 零拷贝技术,而 kafka 使用的是 sendfile 。kafka 以更少的拷贝次数以及系统内核切换次数,获得了更高的性能。但问题又来了,为什么 RocketMQ 不使用 sendfile?参考 kafka 抄个作业也不难啊?我们来看下
sendfile
函数长啥样。
ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);
// num = sendfile(xxx);
再来看下
mmap
函数长啥样。
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
// buf = mmap(xxx)
注释里写的是两个函数的用法,
mmap
返回的是数据的
具体内容
,应用层能获取到消息内容并进行一些逻辑处理。
sendfile
返回的则是发送成功了几个
字节数
,
具体发了什么内容,应用层根本不知道
。
除了零拷贝以外,kafka 高性能的原因还有很多,比如什么批处理,数据压缩啥的,但那些优化手段 rocketMQ 也都能借鉴一波,唯独这个零拷贝,那是毫无办法。
kafka 和 RocketMQ 怎么选?
这时候大家估计还是想知道 kafka 和 RocketMQ 到底该怎么选,用哪个。官方点的回答是"这个要看场景的"。说了等于没说。这不是我的风格。我的标准只有一个,如果是大数据场景,比如你能频繁听到 spark,flink 这些关键词的时候,那就用 kafka。除此之外,如果公司组件支持,尽量用 RocketMQ。
现在大家通了吗?
总结
-
• RocketMQ 和 kafka 相比,在架构上做了减法,在功能上做了加法
-
• 跟 kafka 的架构相比,RocketMQ 简化了协调节点和分区以及备份模型。同时增强了消息过滤、消息回溯和事务能力,加入了延迟队列,死信队列等新特性。
-
• 凡事皆有代价,RocketMQ 牺牲了一部分性能,换取了比 kafka 更强大的功能特性。
- END -
-
重启解决99%故障?微软全球瘫痪11小时,无奈手动重启服务器救急!
-
微软更新翻车:Windows Server 2022自动升级至2025,运维天塌了!
-
运维越老越吃香的时代要过去了……
-
又是一年中秋节,大厂礼盒哪家强?字节、腾讯、美团、阿里……
-
SQL Server 真的比不上 MySQL 吗?
-
滴滴分布式数据库选型之路
-
再见了,UUID ! ULID更香!
-
数据库备份脚本嘎嘎香,被秀到了!
-
因为意外删库,这家软件届的爱马仕遭遇了成立 5 年来的最大故障
-
号外!《核心系统分布式数据库选型指南》电子书(附下载)正式上线
-
解锁数 据架构现代化密码,《实 时数仓选型指南》电子书(附下载)正式上线啦