“为什么Kafka性能如此快”这是大厂经常考察的一个话题,下面我就重点讲解“Kafka为什么性能这么快”的4大核心原因@mikechen
磁盘顺序写
Kafka 利用了磁盘的顺序写操作,其性能远高于随机写操作。
为什么“采用顺序写”可以极大的提升效率呢?原因很简单:顺序写减少了磁盘寻道时间。
看下图,这是典型的磁盘的结构:
在传统的磁盘驱动器(HDD)中,数据的读写过程,通常会受到寻道时间、和旋转时间的影响:
寻道时间(Seek Time):
这是磁头移动到正确的磁道上的时间,寻道时间通常是磁盘操作中耗时最多的部分,因为需要移动磁头到正确的柱面。
旋转时间(Rotational Latency):
一旦磁头在正确的磁道上,需要等待磁盘旋转,使得目标扇区正好移动到磁头下方。
如果采用随机写,每次都需要涉及到“寻道”,这就会极大的降低读写效率。
所以,采用磁盘顺序写,这样就不需要寻道时间,顺序写减少了磁盘寻道时间,使得数据写入操作非常高效。
零拷贝
Kafka 采用了零拷贝(Zero Copy)技术,来优化数据传输,这也是提升数据读写非常好的方式。
要理解零拷贝,首先需要理解:“什么是非零拷贝”?,这就需要理解传统的数据传输。
传统的数据传输,需要通过内核空间、和用户空间之间的多次数据拷贝。
如下图所示:
上述流程中涉及到:多次上下文切换和数据拷贝:
- 4次上下文切换:用户态到内核态的切换、和内核态到用户态的返回;
- 4次数据拷贝:
- 2次CPU拷贝:从内核缓冲区到用户缓冲区,再从用户缓冲区到内核缓冲区;
- 2次DMA拷贝:从磁盘到内核缓冲区,再从内核缓冲区到网络设备。
这些多次拷贝,会极大降低性能,所以,如果能减少拷贝次数,必然能提升读写效率。
Kafka 通过采用零拷贝技术,如下图所示:
Kafka 利用了 Linux 的 sendFile 技术,省去了进程切换、和一次数据拷贝,减少了“拷贝次数”,从而,让性能变得更好。
分布式架构
Kafka 的分布式设计允许数据被分区,并在多个 Broker 上进行存储和处理。
Kafka 的分布式架构,由以下几个关键组件构成:
- Broker(代理):
- Kafka 集群由多个 Broker 组成,每个 Broker 负责存储和处理一部分数据;
- 数据被分成若干个分区,每个分区属于一个特定的 Broker;
- Broker 之间通过 ZooKeeper 进行协调,确保集群的一致性和高可用性。
- Topic(主题):
- 数据按照主题进行组织,每个主题可以有多个分区。
- 生产者将数据发送到特定主题的分区,消费者从特定主题的分区读取数据。
- Partition(分区):
- 每个主题被分成若干个分区,每个分区是一个有序的、不可变的消息队列;
- 分区的存在使得数据可以并行处理,提升了系统的吞吐量和处理能力。
Kafka 的水平扩展能力体现在以下几个方面:
- 可以随时向: Kafka 集群中添加新的 Broker;
- 通过增加分区数量,可以提升并行处理能力;
- 新分区可以分配到现有、或新加入的 Broker 上,从而分散负载,提高系统的吞吐量。
通过这些机制,Kafka 实现了高效的分布式数据存储和处理,能够在大规模数据流环境中保持高性能。
高效的网络和异步处理
Kafka 的二进制协议设计简洁,减少了数据序列化和反序列化的开销,提高了网络传输效率。
以及,通过支持多种压缩算法(如 GZIP、Snappy、LZ4),Kafka 可以在网络传输、和磁盘存储时减少数据量。
生产者和消费者可以以异步方式发送和接收消息,允许并行处理多个请求,从而提高整体吞吐量和响应速度。
通过这些优化技术,共同造就了 Kafka 的高性能。
陈睿mikechen
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》