前言

天下武功,唯快不破。同样的,kafka在音讯行列领域,也是十分快的,这儿的块指的是kafka在单位时刻转移的数据量巨细,也就是吞吐量,下图是转移网上的一个功能测试结果,在同步发送场景下,单机Kafka的吞吐量高达17.3w/s,不愧是高吞吐量音讯中心件的职业老迈。

面试官问:kafka为什么如此之快?

那究竟是什么原因让kafka如此之快呢?这也是面试官十分喜爱问的问题。

四个原因

原因一:磁盘次序读写

出产者发送数据到kafka集群中,终究会写入到磁盘中,会选用次序写入的方法。顾客从kafka集群中获取数据时,也是选用次序读的方法。

无论是机械磁盘仍是固态硬盘SSD,次序读写的速度都是远大于随机读写的。由于对于机械磁盘次序读写省去了磁头频繁寻址和旋转盘片的开支。而固态硬盘就愈加杂乱,这儿不展开论述。

下图是网上关于读写方法的功能比较。

面试官问:kafka为什么如此之快?

  • 机械磁盘次序读写 53M/s,随读写 316k/s
  • 固态硬盘次序读写 42M/s, 随机读写 1000k/s

因此,由于kafka一般使用机械磁盘存储音讯,由于机械磁盘的价格远小于固态硬盘SSD。

原因二:PageCache页缓存技能

前面提到了kafka选用次序读写写入到磁盘中,难道是直接kafka到磁盘吗,实际上不是的,中心多了一道操作系统的PageCache页缓存,能够理解为内存。

面试官问:kafka为什么如此之快?

  • 当kafka有写操作时,先将数据写入PageCache中,然后在守时方法次序写入到磁盘中。
  • 当读操作发生时,先从PageCache中查找,假如找不到,再去磁盘中读取。

通过页缓存技能,更近一步的进步了读写的功能。

原因三:零复制技能

kafka之所以快的另外一个原因是选用了零复制技能。

首先咱们来看下从磁盘读取数据到网卡场景下,传统IO的整个过程,如下图所示:

面试官问:kafka为什么如此之快?

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

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

那能否削减这样的切换和复制呢? 答案是肯定的,不知道咱们发下没有,kafka的音讯在应用层做任何转换,怎样存就怎样取,你看连序列化、反序列化都是在出产者和顾客做的。所以kafka选用了sendfile的零复制技能

面试官问:kafka为什么如此之快?

sendfile零复制技能在内核态将数据从PageCache复制到了Socket缓冲区,这样就大大削减了不同形状的切换以及复制。

所谓的零复制技能不是指不发生复制,而是在用户态没有进行复制。

原因四:kafka分区架构和批量操作

一方面kafka的集群架构选用了多分区技能,并行度高。另外一方面,kafka选用了批量操作。出产者发送的音讯先发送到一个行列,然后有sender线程批量发送给kafka集群。

面试官问:kafka为什么如此之快?

怎么进步出产者的吞吐量?

kafka出产者供给的一些配置参数能够有助于进步出产者的吞吐量。

参数称号 描绘
buffer.memory RecordAccumulator 缓冲区总巨细,默许 32m。恰当添加该值,能够进步吞吐量。
batch.size 缓冲区一批数据最大值,默许 16k。恰当添加该值,能够进步吞吐量,可是假如该值设置太大,会导致数据传输推迟添加。
linger.ms 假如数据迟迟未到达 batch.sizesender线程等候 linger.time之后就会发送数据。单位 ms,默许值是 0ms,表示没有推迟。出产环境主张该值巨细为 5-100ms 之间。
compression.type 指定音讯的紧缩方法,默许值为“none “,即默许情况下,音讯不会被紧缩。该参数还能够配置为 “gzip“,”snappy” 和 “lz4“。对音讯进行紧缩能够极大地削减网络传输、下降网络 I/O,然后进步整体的功能 。

怎么进步顾客的吞吐量?

  1. 假如是Kafka消费才能缺乏,则能够考虑添加Topic的分区数,而且同时提升消费组的顾客数量,顾客数 = 分区数,并发度最高
  2. 假如是下游的数据处理不及时:进步每批次拉取的数量。批次拉取数据过少,使处理的数据小于出产的数据,也会形成数据积压。
  • fetch.max.bytes:默许 Default: 52428800(50 m)。顾客获取服务器端一批音讯最大的字节数。假如服务器端一批次的数据大于该值(50m)仍然能够拉取回来这批数据,因此,这不是一个绝、对最大值。一批次的巨细受 message.max.bytes (broker config)or max.message.bytes (topic config)影响。
  • max.poll.records:一次 poll 拉取数据回来音讯的最大条数,默许是 500
  1. 优化顾客代码处理的逻辑。

总结

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

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

通常在大数据、流式处理场景根本选用 Kafka,事务处理相关挑选 RocketMQ更佳。

欢迎重视个人公众号【JAVA旭阳】交流学习