前言
天下武功,唯快不破。同样的,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出产者供给的一些配置参数能够有助于进步出产者的吞吐量。
参数称号 | 描绘 |
---|---|
buffer.memory |
RecordAccumulator 缓冲区总巨细,默许 32m。恰当添加该值,能够进步吞吐量。 |
batch.size |
缓冲区一批数据最大值,默许 16k。恰当添加该值,能够进步吞吐量,可是假如该值设置太大,会导致数据传输推迟添加。 |
linger.ms |
假如数据迟迟未到达 batch.size ,sender 线程等候 linger.time 之后就会发送数据。单位 ms,默许值是 0ms,表示没有推迟。出产环境主张该值巨细为 5-100ms 之间。 |
compression.type |
指定音讯的紧缩方法,默许值为“none “,即默许情况下,音讯不会被紧缩。该参数还能够配置为 “gzip “,”snappy ” 和 “lz4 “。对音讯进行紧缩能够极大地削减网络传输、下降网络 I/O,然后进步整体的功能 。 |
怎么进步顾客的吞吐量?
- 假如是Kafka消费才能缺乏,则能够考虑添加
Topic
的分区数,而且同时提升消费组的顾客数量,顾客数 = 分区数,并发度最高。 - 假如是下游的数据处理不及时:进步每批次拉取的数量。批次拉取数据过少,使处理的数据小于出产的数据,也会形成数据积压。
-
fetch.max.bytes
:默许Default: 52428800(50 m)
。顾客获取服务器端一批音讯最大的字节数。假如服务器端一批次的数据大于该值(50m)
仍然能够拉取回来这批数据,因此,这不是一个绝、对最大值。一批次的巨细受message.max.bytes (broker config)or max.message.bytes (topic config)
影响。 -
max.poll.records
:一次poll
拉取数据回来音讯的最大条数,默许是500
条
- 优化顾客代码处理的逻辑。
总结
本文总结了Kafka为什么快的原因,4个关键字,磁盘次序读写,页缓存技能,零复制技能,Kafka本身分区机制和批量操作。咱们抓住这4个关键字,有点到面地和面试官娓娓道来。
Kafka
在功能上确实是一骑绝尘,但在音讯选型过程中,咱们不仅仅要参阅其功能,还有从功能性上来考虑,例如 RocketMQ
供给了丰富的音讯检索功能、事务音讯、音讯消费重试、守时音讯等。
通常在大数据、流式处理场景根本选用 Kafka
,事务处理相关挑选 RocketMQ
更佳。
欢迎重视个人公众号【JAVA旭阳】交流学习