Kafka 作为音讯队列中的中坚力量,基本上是每次面试必问的知识点。而说到 Kafka,大家对它的印象就是快!异样地快!
因而,为什么 Kafka 这么快,也是每次面试必问的知识点。对于混迹 Java 技术圈多年的我来说,Kafka 这么快的个性曾经了然于胸。明天,就让我带着大家盘一盘!
Kafka 写入速度十分快,次要得益于其零碎架构设计,包含:
- PageCache
- 批量压缩传输
- 程序、批量写磁盘
- 多 partition 扩散存储
PageCache
学过操作系统的同学都晓得,内存是易失落的存储介质,而磁盘则是不容易失落的存储介质。但内存读写速度快,而磁盘读写速度慢。操作系统为了能进步写磁盘的速度,于是在内存中开拓了一小块,用来作为写入磁盘的缓冲,进步写磁盘的速度,这小块内存叫 PageCache。
Kafka 之所以这么快,其中一个很重要的点就是用了 PageCache。Kafka broker 写入音讯的时候,其实并不是间接写入文件,而是写入零碎的 PageCache 内存,后续才有操作系统刷入文件中。通过这种形式,Kafka broker 就不间接写文件,而是间接写内存,这样就十分疾速了!
因为有 PageCache 的存在,也有了所谓的刷盘。简略来说,就是同步刷盘,还是异步刷盘。同步刷盘,能够了解成写 PageCache 之后间接写磁盘。
这样的益处是音讯不会失落,然而害处就是速度慢。异步刷盘则相同,写 PageCache 之后就完结,期待操作系统异步刷盘。这里说的「盘」指的就是「磁盘」。
Kafka 因而也提供了两个参数来管制刷盘形式,别离是:log.flush.interval.messages 和 log.flush.interval.ms。前者示意数据达到多少条就将音讯刷到磁盘,如果你心愿数据不失落,那么必须设置为 1。后者示意多久将累积的音讯刷到磁盘。这两个参数任何一个达到指定值就触发写入。
批量压缩传输
咱们都晓得 Kafka 音讯都是由生产者发送给 Kafka 服务器,再由 Kafka 服务器存储起来的。在很多状况下,零碎的瓶颈不是 CPU 或磁盘,而是网络带宽,对于须要在广域网上的数据中心之间发送音讯的数据流水线尤其如此。
Kafka 之所以能这么快,其中有一个很重要的起因是采纳了批量压缩传输。在 Kafka 提供的客户端里,其每次发送给 Kafka 服务器的时候,并不是一条音讯一条音讯发送,而是一批音讯一批音讯发送,并且还会启用数据压缩算法。通过这种形式,本来可能 1 秒只能发送 1 条的能力,霎时晋升到了 1 千条,甚至一万条。
程序、批量写磁盘
当音讯到了 Kafka 服务器之后,Kafka 写入内存,最终还是须要写入磁盘。咱们晓得当初的磁盘大多数都还是机械构造(SSD 不在探讨的范畴内)。
如果将音讯以随机写的形式存入磁盘,就会按柱面、磁头、扇区的形式进行(寻址过程),迟缓的机械运动(绝对内存)会耗费大量工夫,导致磁盘的写入速度只能达到内存写入速度的几百万分之一。
为了躲避随机写带来的工夫耗费,Kafka 采取程序写的形式存储数据,这样就缩小了寻址的工夫,极大地提高了写入速度。因而程序写入磁盘,是 Kafka 之所以这么快的一个要害起因。其次,Kafka 也采纳音讯批量写入磁盘的形式,每次写入一批数据,而不是只写入一条音讯,这样就极大地提高了效率。
多 partition 扩散存储
咱们晓得磁盘的写入是有物理极限的,如果同时有特地多的线程写入,达到了物理极限,那么其余线程就只能期待了。而 Kafka 存储的特点是小文件存储,并且切分成多个 Partition,扩散在多个机器。这样读取的时候就能够充分利用磁盘的 IO,从而达到高效读取的目标。
试想,如果文件太大,并且只存在一个磁盘,那么该磁盘的压力得有多大?
总结
Kafka 的写入流程能够分为将数据传输到 Kafka 服务器,之后将数据写入磁盘。在数据传输阶段,Kafka 利用批量加压缩的形式,极大地晋升了每次能发送的数据量,从而进步了写入速度。
而在写入磁盘环节,通过存储构造的设计,使得 Kafka 能够批量、程序写入,从而缩小磁盘寻道的工夫。并且通过小文件的存储形式,进步了整体磁盘的耐受力。
批量写入、压缩的传输方式,与磁盘程序写入、小文件多 partition 造就了 Kafka 强悍的写入速度!