kafka为什么如此之快?-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

天下武功唯快不破。同样的kafka在消息队列领域也是非常快的这里的块指的是kafka在单位时间搬运的数据量大小也就是吞吐量下图是搬运网上的一个性能测试结果在同步发送场景下单机Kafka的吞吐量高达17.3w/s不愧是高吞吐量消息中间件的行业老大。
在这里插入图片描述
那究竟是什么原因让kafka如此之快呢这也是面试官非常喜欢问的问题。

四个原因
原因一磁盘顺序读写
生产者发送数据到kafka集群中最终会写入到磁盘中会采用顺序写入的方式。消费者从kafka集群中获取数据时也是采用顺序读的方式。

无论是机械磁盘还是固态硬盘SSD顺序读写的速度都是远大于随机读写的。因为对于机械磁盘顺序读写省去了磁头频繁寻址和旋转盘片的开销。而固态硬盘就更加复杂这里不展开阐述。

下图是网上关于读写方式的性能比较。
在这里插入图片描述

机械磁盘顺序读写 53M/s随读写 316k/s
固态硬盘顺序读写 42M/s, 随机读写 1000k/s
因而由于kafka一般使用机械磁盘存储消息因为机械磁盘的价格远小于固态硬盘SSD。

原因二PageCache页缓存技术
前面提到了kafka采用顺序读写写入到磁盘中难道是直接kafka到磁盘吗实际上不是的中间多了一道操作系统的PageCache页缓存可以理解为内存。

在这里插入图片描述
当kafka有写操作时先将数据写入PageCache中然后在定时方式顺序写入到磁盘中。
当读操作发生时先从PageCache中查找如果找不到再去磁盘中读取。
通过页缓存技术更近一步的提高了读写的性能。

原因三零拷贝技术
kafka之所以快的另外一个原因是采用了零拷贝技术。

首先我们来看下从磁盘读取数据到网卡场景下传统IO的整个过程如下图所示
在这里插入图片描述

传统IO模型下从磁盘读取数据写到网卡设备中经历了4次用户态和内核态之间的切换以及4次数据的拷贝包括CPU拷贝和DMA拷贝。这些操作都是十分损耗性能。

DMA, Direct Memory Access,
直接内存访问是一些计算机总线架构提供的功能它能使数据从附加设备如磁盘驱动器直接发送到计算机主板的内存上。

那能否减少这样的切换和拷贝呢 答案是肯定的不知道大家发下没有kafka的消息在应用层做任何转换怎么存就怎么取你看连序列化、反序列化都是在生产者和消费者做的。所以kafka采用了sendfile的零拷贝技术。
在这里插入图片描述

sendfile零拷贝技术在内核态将数据从PageCache拷贝到了Socket缓冲区这样就大大减少了不同形态的切换以及拷贝。

所谓的零拷贝技术不是指不发生拷贝而是在用户态没有进行拷贝。

原因四kafka分区架构和批量操作
一方面kafka的集群架构采用了多分区技术并行度高。另外一方面kafka采用了批量操作。生产者发送的消息先发送到一个队列然后有sender线程批量发送给kafka集群。
在这里插入图片描述

如何提高生产者的吞吐量
kafka生产者提供的一些配置参数可以有助于提高生产者的吞吐量。

在这里插入图片描述
如何提高消费者的吞吐量?
如果是Kafka消费能力不足则可以考虑增加Topic的分区数并且同时提升消费组的消费者数量消费者数 = 分区数并发度最高。
如果是下游的数据处理不及时提高每批次拉取的数量。批次拉取数据过少使处理的数据小于生产的数据也会造成数据积压。
fetch.max.bytes默认 Default: 5242880050 m。消费者获取服务器端一批消息最大的字节数。如果服务器端一批次的数据大于该值50m仍然可以拉取回来这批数据因此这不是一个绝、对最大值。一批次的大小受 message.max.bytes broker configor max.message.bytes topic config影响。
max.poll.records一次 poll 拉取数据返回消息的最大条数默认是 500 条
优化消费者代码处理的逻辑。

总结

本文总结了Kafka为什么快的原因4个关键字磁盘顺序读写页缓存技术零拷贝技术Kafka本身分区机制和批量操作。我们抓住这4个关键字有点到面地和面试官娓娓道来。

Kafka 在性能上确实是一骑绝尘但在消息选型过程中我们不仅仅要参考其性能还有从功能性上来考虑例如 RocketMQ
提供了丰富的消息检索功能、事务消息、消息消费重试、定时消息等。

通常在大数据、流式处理场景基本选用 Kafka业务处理相关选择 RocketMQ更佳。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6