Kafka是高并发架构的核心,也是大厂重点考察对象,下面详解Kafka如何实现百万级高性能@mikechen
1、页缓存技术
页缓存技术是一种在操作系统中,用于优化磁盘“I/O性能”的重要技术。
Kafka 利用操作系统的页缓存技术,通过内存缓冲区高效地处理消息写入、和读取,减少磁盘 I/O 操作,提高系统的性能、和吞吐量。
kafka页缓存写入,如下图所示:
大致步骤,如下:
首先,Kafka将缓冲区中的消息,写入操作系统的页缓存(Page Cache)中。
备注:页缓存(Page Cache),由操作系统管理的内存区域,用于缓存即将写入磁盘的数据。
然后,是数据刷盘,页缓存中的数据,会被操作系统自身的机制刷入磁盘。
备注:Kafka 可以通过配置参数(如 log.flush.interval.messages
和 log.flush.interval.ms
)来控制刷盘频率。
由于写入内存的速度远高于写入磁盘的速度,因此,使用页缓存能够显著减少磁盘I/O操作,提高写入性能。
2、磁盘顺序写
Kafka 的磁盘顺序写(sequential write),是其高性能、高吞吐量的关键技术之一。
Kafka 将消息,存储在分区(Partition)的日志文件中,这些日志文件是按照消息的顺序追加写入的。
如下图所示:
Kafka 使用追加写入的方式,将新消息写入日志文件的末尾,这种方式避免了随机写操作,最大化了磁盘写入效率。
要搞清楚追加写入“快”,这里的重点就是要理解:“为什么采用随机慢”?
采用顺序写入比随机写入更高效,因为磁盘不需要频繁地移动读写磁头,减少了寻道时间。
如下图所示:
机械硬盘采用磁头,在盘片上移动的方式进行读写操作,磁头需要移动到正确的磁道位置,这个过程称为寻道。
寻道操作需要花费的时间:取决于磁头的移动速度,和目标磁道、与当前磁头位置的距离。
而随机的情况,读写会导致磁头频繁移动到不同的位置进行寻道,这增加了寻道时间的累积和延迟。
所以,顺序写入比随机写入更高效,这也是Kafka实现高性能、和高吞吐量的另一个重要原因。
3、零拷贝
Kafka 使用零拷贝(Zero-Copy)技术,这种技术减少了数据在用户空间、和内核空间之间的拷贝次数。
如下图所示:
传统的数据传输过程,涉及多次数据拷贝,具体步骤如下:
- 首先,数据从磁盘读取到内核空间的缓冲区;
- 然后,从内核空间的缓冲区,拷贝到用户空间的缓冲区;
- 然后,从用户空间的缓冲区,再拷贝回内核空间的网络缓冲区;
- 最后,从内核空间的网络缓冲区发送到网络接口。
这些步骤中的每一次数据拷贝都会消耗 CPU 资源,拷贝技术通过减少数据拷贝次数来优化这一过程。
4、高效的网络通信
Kafka 使用高效的二进制协议进行网络通信,减少了数据编码、和解码的开销。
并且,Kafka 支持异步生产和消费消息,生产者和消费者可以并发处理消息,提高系统的并发性能。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》