【Java面试】某滴二面高频面试题,简单说一下Kafka为什么这么快?

2022-09-22 11:29:13 浏览数 (1)

最近一位小伙伴去某滴面试,在第二面的时候遇到了这个问题:说”请你简单说一下,Kafka为什么这么快?“,然后,这位小伙伴努力在大脑里检索了很久,没有回答上来。

那么今天,我给大家分析一下,来看看对这个问题的理解。

另外,我花了很长时间,准备了一份500页的PDF面试资料文档和一份10W字的Java总结面试题和答案,

Kafka是一个号称能用普通的PC机也能处理超千万亿的消息吞吐量的实时消息流处理平台。我认为Kafka之所以能支持如此大的吞吐量,而且还能做到性能优秀主要有四个原因:分别是磁盘顺序读写、稀疏索引、批量文件压缩和零拷贝机制。下面分别给大家详细介绍一下:

1、磁盘顺序读写

首先要讲一下,磁盘寻址的过程,如图所示:

ENTER TITLE

这个是磁盘的构造。磁盘的盘片不停地旋转,磁头会在磁盘表面画出一个圆形轨迹,这个就叫磁道。从内到位半径不同有很多磁道。然后又用半径线,把磁道分割成了扇区(两根射线之内的扇区组成扇面)。如果要读写数据,必须找到数据对应的扇区,这个过程就叫寻址。

如果读写的多条数据在磁盘上是分散的,寻址会很耗时,这叫随机I/O。

如果读写的数据在磁盘上是集中的,不需要重复寻址的过程,这叫顺序I/O。

而Kafka的Message是不断追加到本地磁盘文件末尾的,而不是随机的写入,这使得Kafka写入吞吐量得到了显著提升。

在一定条件下测试,磁盘的顺序读写可以达到53.2M每秒,比内存的随机读写还要快。

2、稀疏索引

Kafka的索引并不是每一条消息都会建立索引,而是一种稀疏索引。如图所示,

ENTER TITLE

也就是说,Kafka插入一批消息才会产生一条索引记录。后续利用二分查找,可以大大提高检索效率。

3、批量文件压缩

Kafka默认不会删除数据,它会把所有的消息都变成一个批量的文件。如图所示,它会把相同的Key合并为最后一个Value。

ENTER TITLE

这样对消息进行合理的批量压缩,可以减少网络IO损耗。

4、零拷贝机制

操作系统的虚拟内存分成两部分,一部分是内核空间,一部分是用户空间。这样就可以避免用户进程直接操作内核,保证内核安全。如图所示:

ENTER TITLE

正常情况下,如果用户要从磁盘读取数据,必须先把数据从磁盘拷贝到内核缓冲区,然后在从内核缓冲区到用户缓冲区,最后才能返回给用户。

在Linux操作系统里面提供了一个sendfile函数,可以实现“零拷贝”。意思就是不需要经过用户缓冲区,可以直接把数据拷贝到网卡。

而Kafka中文件传输最终调用的是Java NIO 库里的 transferTo 方法,实际上最后就会使用到Linux sendfile() 系统调用函数。零拷贝技术可以大大地提升文件传输的性能。

这道面试题涉及到一些计算机底层的原理,基本上也是业务程序员的知识盲区。但我想给大家一个建议,做开发其实和建房子一样,要想楼层更高更稳,首先地基要打牢固。

最后,我把之前分享的资料全部整理成了文字,希望能够以此来提高各位粉丝的通过率。

我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!

0 人点赞