有关Kafuka与RocketMQ效率

1.RocketMQ与Kafuka

RocketMQ每秒大概能够处理10w量级的数据,kafuka能处理17w量级的数据

2.0拷贝

2.1 消息从消息队列的磁盘发送到消费者的过程

操作系统分为内核空间和用户空间,程序处于用户空间,磁盘属于硬件

程序
操作系统用户空间
内核空间
硬件

程序发起系统调用 read() 将磁盘数据从设备拷贝到内核空间的缓冲区,再从内核空间的缓冲区拷贝到用户空间的缓冲区,程序再发起系统调用 write() 将数据从用户空间拷贝到Socket发送缓冲区,再从Socket发送缓冲区拷贝到网卡,最终数据通过网络到达消费者。全过程本机内发生了两次系统调用,对应四次用户空间和内核空间的切换,以及四次数据的拷贝。

2.2 常见的零拷贝技术 - mmap

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

程序发起系统调用 mmap() 将磁盘数据从设备拷贝到内核空间的缓冲区,内核空间的缓冲区映射到用户空间,这里不是需要拷贝,程序再发起系统调用 write() 将数据从系统空间缓冲区拷贝到Socket发送缓冲区,再从Socket发送缓冲区拷贝到网卡,最终数据通过网络到达消费者。全过程本机内发生了两次系统调用,对应四次用户空间和内核空间的切换,以及三次数据的拷贝。

这种零拷贝技术的实现,指的是数据从内核空间到用户空间的过程不需要拷贝,而不是指数据从磁盘发送到网卡不需要拷贝。

2.3 常见的零拷贝技术 - sendfile

sendfile() 是操作系统提供的一个方法,用来发送文件数据。

程序发起系统调用 sendfile() 磁盘将磁盘数据从设备拷贝到内核空间的缓冲区,内核空间缓冲区内的数据直接拷贝到网卡。全过程本机内发生了一次系统调用,对应两次用户空间和内核空间的切换,以及两次数据的拷贝。

这种零拷贝技术的实现,指的是零CPU参与的拷贝,sendfile() 所实现的拷贝是依靠DMA控制器来做的拷贝。

3.Kafuka为什么性能比RocketMQ更好

Kafuka使用的是基于sendfile技术实现的零拷贝,而RocketMQ使用的是基于mmap技术实现的零拷贝。Kafuka以更少的拷贝次数以及系统内核切换次数获得了更高的性能。

3.1 sendfile函数的参数列表

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
参数参数含义
out_fd目标文件描述符,即数据将被写入的文件。
in_fd源文件描述符,即数据将被从中读取的文件。
*offsaet指向一个“偏移量”的指针,它指定从in_fd的哪个位置开始读取数据。如果offset不是NULL,那么sendfile会更新这个偏移量以反映实际读取的字节数。如果offsetNULL,那么数据会从in_fd的当前偏移量开始读取。
count指定要传输的最大字节数。

 返回值是一个整数类型,成功时返回传输的字节数,失败时返回-1,并设置errno以指示错误。

3.2 mmap函数的参数列表

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数参数含义
*addr这是一个指向期望映射区域的起始地址的指针。通常,它被设置为 NULL,表示让系统决定映射区域的地址。
length映射区域的长度,单位是字节。
prot映射区域的保护方式。它可以是以下标志的组合:
PROT_READ映射区域可被读取
PROT_WRITE映射区域可被写入
PROT_EXEC映射区域可被执行
PROT_NONE映射区域不能被访问
flags控制映射区域的特性和行为。它可以是以下标志的组合:
MAP_SHARED对映射区域的写入会反映到底层文件中。
MAP_PRIVATE对映射区域的写入会产生一个映射区域的私有拷贝(写时复制)。
MAP_FIXED映射区域必须使用 addr 参数指定的地址。
MAP_ANONYMOUS 或 MAP_ANON创建一个匿名映射,不与任何文件关联。
其他如 MAP_GROWSDOWNMAP_DENYWRITE 等,用于特定场景。
fd要映射的文件描述符。如果 flags 参数包含了 MAP_ANONYMOUS 或 MAP_ANON,则 fd 应被设置为 -1
offset文件中的偏移量,单位是字节,从该偏移量开始映射文件内容到内存。

返回值,成功时mmap返回指向映射区域的指针,出错时,返回MAP_FAILED并设置errno指示错误。

3.3 RocketMQ为什么不用sendfile实现零拷贝

mmap返回的是指向映射区域的指针,应用层能够获取到消息的具体内容,而sendfile返回的则是本次成功发送了字节数,无法直接获取到消息的具体内容进行特殊处理。RocketMQ的一些功能需要了解具体消息内容方便二次投递等,如RocketMQ将消费失败的消息重新投递到死信队列的行为就是依靠mmap方法获取的具体消息内容。

4.RocketMQ和Kafuka怎么选择?

大数据场景选用Kafuka(Spark,Flink),除此之外选用RocketMQ。

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值