解密kafka性能为何这么快

一 磁盘顺序读写

我们来看一份关于顺序存储的结论:

![image](images/pgfwTX0igkPGKv7Oyx8KHclErfIMFTEoEelTfMwiaVw.png)

从上图我们可以看到,最快的肯定是内存,但是在常规的磁盘下,顺序存储的性能是非常优秀的,于是kafka就采取了顺序存储的方式来设计:

![image](images/9NyZjUarsxdHeOIuFCXbUg5fvxEDBzkTseFvxHEWvHo.png)

kafka为了保证每个分区在数据被消费后,新的数据进来不影响顺序存储,采取了折中的方案,即不实时的删除数据。而是采取策略,基于时间或者分区文件的大小做统一删除,保证数据的连续。

![image](images/E7EZZ8U0PWn48VUCvSla3dmOffLASHXG4wOjo5Ry-4E.png)

二 页缓存

Kafka避免使用JVM

直接使用操作系统的页缓存特性提高处理速度

进而避免了JVM GC带来的性能损耗

Kafka采用字节流,紧密存储,避免产生对象,这样可以进一步提高空间利用率

![image](images/6mbMobVtB0_0jFm70YUh2ulPCHrPdj9MpVlLyTD1aqM.png)

三 零拷贝(不进行和用户态的拷贝)

鉴于kafka采用了页缓存直接利用操作系统,而linux有一个特性就是0拷贝。

假如磁盘有一条数据要被读取,他会先被加载到内核态的页缓存中,但是直接内核态的数据我们是无法利用的,需要复制到用户态的应用内存中,但是kafka没这样做,在数据被加载到页缓存的时候,直接发送到socket缓存区。

![image](images/fTiPTVZ7rjBkgZ7ZUflZ8zFMCALG_hbOZG8QO6C4F4c.png)

四 批量操作

kafka支持批量的数据操作。

Last modification:July 5, 2022
If you think my article is useful to you, please feel free to appreciate