咱们还是用一张图先概括一切的要点:
批量发送与紧缩
Kafka发送信息时,首先将信息启动批量打包,而后紧缩后经过网络传输,Producer可以经过GZIP或Snappy格局对信息汇合启动紧缩。这样可以缩小网络传输的开支,同时也可以应用紧缩算法来降落磁盘存储的空间占用。
低劣的网络模型
Kafka经常使用了基于Java NIO的网络框架,其实也是个 reactor的模型。他的设计中,Accepter 作为一个 main reactor,外面蕴含了 child reactor 即 processor,而后发送和接纳都是经过队列的形式异步启动[1]。
磁盘顺序写
与随机访问相比,磁盘上的顺序写操作要快得多。Kafka将每个分区的日志作为一系列延续的文件段启动治理,并且总是追加到优惠的日志文件末尾。
页缓存技术(MMAP内存映射)
即使是顺序写入硬盘,硬盘的访问速度还是无法能追上内存。所以 Kafka 的数据并不是实时的写入硬盘 ,它充沛应用了现代操作系统页缓存来应用内存提高 I/O 效率。kafka在写数据的时刻,会先将数据写入到页缓存,满足必定条件后刷写到磁盘上,可以保障更高的读写性能。
操作系统自身有一层缓存,叫做page cache,是在内存里的缓存,咱们也可以称之为os cache,意思就是操作系统自己治理的缓存。你在写入磁盘文件的时刻,可以间接写入这个os cache里,也就是仅仅写入内存中,接下来由操作系统自己选择什么时刻把os cache里的数据真的刷入磁盘文件中[2]。
MMAP将磁盘文件映射到内存,用户经过修正内存就能修正磁盘文件。经过MMAP,进程像读写硬盘一样读写内存(当然是虚构机内存)。经常使用这种形式可以失掉很大的 I/O 优化,省去了用户空间到内核空间复制的开支。
分区并发
Kafka的分区机制可以成功高并发的数据生产。Kafka中的topic中的内容可以分在多个分区(partition)存储,每个partition又分为多个段segment,所以每次操作都是针对一小局部做操作,很轻巧,并且参与并行操作的才干,每个分区都是独立的、有序的信息队列。
生产者组内的不同成员可以并行地生产不同的分区,从而成功了水平裁减性和更高的并发度。这种设计使得Kafka能够很好地允许大规模的信息处置场景。
Sendfile零拷贝
当客户端恳求读取数据时,Kafka可以应用操作系统级别的零拷贝个性间接将数据从磁盘传输给网络接口,而不须要经过运行程序缓冲区,这样就缩小了不用要的数据复制环节。Kafka 经常使用到了 mmap 和 sendfile 的形式来成功零拷贝。区分对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo。如下图[4]:
结语
Kafka是一个十分低劣的信息系统,它提供了高吞吐量、低提早和高牢靠性等个性。经过经常使用批量发送与紧缩、低劣的网络模型、磁盘顺序写、页缓存、分区并发、sendfile零拷贝等技术,Kafka可成功百万级高吞吐量。
参考:
[1]
[2]
[3]
[4]
[5]
[6]