Kafka必须掌握的核心技术--为什么吞吐量大、速度快?

Kafka必须掌握的核心技术--为什么吞吐量大、速度快?
最新回答
不玩心枉少年

2023-08-04 04:58:37

Kafka 之所以具有高吞吐量、速度快的特点,主要得益于其顺序读写、Page Cache、零拷贝、分区分段+索引、批量读写、批量压缩六大核心技术。以下是对这些技术的详细阐述:

一、顺序读写
  • 磁盘顺序读写性能高:磁盘的顺序读写性能远高于随机读写,甚至在某些情况下高于内存随机读写。Kafka将消息记录持久化到本地磁盘,但采用的是顺序读写的方式,即消息不断追加到本地磁盘文件末尾,而非随机写入。
  • 写入吞吐量显著提升:由于磁盘顺序读写的规律性,操作系统对其做了大量优化,使得Kafka的写入吞吐量得到显著提升。
  • 数据保留策略:Kafka不会删除数据,而是保留所有数据,并通过基于时间和partition文件大小的策略来删除旧数据,以避免磁盘空间被撑满。

二、Page Cache
  • 利用操作系统Page Cache:Kafka利用操作系统本身的Page Cache来优化读写性能,而非使用JVM空间内存。
  • 避免Object消耗和GC问题:使用系统缓存可以避免Java对象内存消耗大和垃圾回收复杂缓慢的问题。
  • 读写速度提升:通过操作系统的Page Cache,Kafka的读写操作基本上是基于内存的,读写速度得到极大提升。
  • 缓存可靠性高:操作系统层面的缓存利用率更高,且即使服务进程重启,系统缓存依然不会消失,避免了in-process cache重建缓存的过程。
三、零拷贝
  • 零拷贝机制:Kafka利用Linux操作系统的“零拷贝”机制,通过sendfile方法将数据从Page Cache直接发送到网络,避免了数据在内核空间和用户空间之间的多余拷贝。
  • 性能提升:零拷贝机制显著提升了Kafka消费端的性能,使得在消费数据时磁盘IO并不高,因为此时是操作系统缓存在提供数据。
  • 数据拷贝过程优化:在不使用零拷贝技术时,数据从磁盘到客户端需要经历多次拷贝;而使用零拷贝技术后,数据直接从内核空间的读缓冲区拷贝到内核空间的socket缓冲区,减少了拷贝次数。

四、分区分段+索引
  • 分区分段存储:Kafka的消息按topic分类存储,topic中的数据又按照partition存储到不同broker节点。每个partition对应操作系统上的一个文件夹,并按照segment分段存储。
  • 查询效率提升:Kafka为分段后的数据文件建立了索引文件(.index文件),通过分区分段+索引的设计提升了数据读取的效率。
  • 并行度提高:这种设计也提高了数据操作的并行度,使得Kafka能够处理更高的吞吐量。
五、批量读写
  • 批次写入:Kafka在写入数据时启用批次写入,避免了在网络上频繁传输单个消息带来的延迟和带宽开销。
  • 性能优化:批量写入可以显著提升写入性能,特别是在网络带宽有限的情况下。
六、批量压缩
  • 网络IO瓶颈解决:在很多情况下,系统的瓶颈不是CPU或磁盘,而是网络IO。Kafka通过批量压缩来减少网络IO损耗。
  • 压缩效率提升:Kafka将多个消息一起压缩而不是单个消息压缩,提高了压缩效率。
  • 多种压缩协议支持:Kafka支持多种压缩协议,包括Gzip和Snappy等,用户可以根据需求选择合适的压缩方式。