Kafka高性能架构详解(图文全面总结)

Kafka高性能架构详解(图文全面总结)-mikechen

“为什么Kafka性能如此快”这是大厂经常考察的一个话题,下面我就重点讲解“Kafka为什么性能这么快”的4大核心原因@mikechen

磁盘顺序写

Kafka 利用了磁盘的顺序写操作,其性能远高于随机写操作。

为什么“采用顺序写”可以极大的提升效率呢?原因很简单:顺序写减少了磁盘寻道时间。

看下图,这是典型的磁盘的结构:

Kafka高性能架构详解(图文全面总结)-mikechen

在传统的磁盘驱动器(HDD)中,数据的读写过程,通常会受到寻道时间、和旋转时间的影响:

寻道时间(Seek Time)

这是磁头移动到正确的磁道上的时间,寻道时间通常是磁盘操作中耗时最多的部分,因为需要移动磁头到正确的柱面。

旋转时间(Rotational Latency)

一旦磁头在正确的磁道上,需要等待磁盘旋转,使得目标扇区正好移动到磁头下方。

如果采用随机写,每次都需要涉及到“寻道”,这就会极大的降低读写效率。

所以,采用磁盘顺序写,这样就不需要寻道时间,顺序写减少了磁盘寻道时间,使得数据写入操作非常高效。

 

零拷贝

Kafka 采用了零拷贝(Zero Copy)技术,来优化数据传输,这也是提升数据读写非常好的方式。

要理解零拷贝,首先需要理解:“什么是非零拷贝”?,这就需要理解传统的数据传输。

传统的数据传输,需要通过内核空间、和用户空间之间的多次数据拷贝。

如下图所示:

Kafka高性能架构详解(图文全面总结)-mikechen

上述流程中涉及到:多次上下文切换和数据拷贝:

  • 4次上下文切换:用户态到内核态的切换、和内核态到用户态的返回;
  • 4次数据拷贝
    • 2次CPU拷贝:从内核缓冲区到用户缓冲区,再从用户缓冲区到内核缓冲区;
    • 2次DMA拷贝:从磁盘到内核缓冲区,再从内核缓冲区到网络设备。

这些多次拷贝,会极大降低性能,所以,如果能减少拷贝次数,必然能提升读写效率。

Kafka 通过采用零拷贝技术,如下图所示:

Kafka高性能架构详解(图文全面总结)-mikechen

Kafka 利用了 Linux 的 sendFile 技术,省去了进程切换、和一次数据拷贝,减少了“拷贝次数”,从而,让性能变得更好。

 

分布式架构

Kafka 的分布式设计允许数据被分区,并在多个 Broker 上进行存储和处理。

Kafka 的分布式架构,由以下几个关键组件构成:

Kafka高性能架构详解(图文全面总结)-mikechen

  1. Broker(代理)
    • Kafka 集群由多个 Broker 组成,每个 Broker 负责存储和处理一部分数据;
    • 数据被分成若干个分区,每个分区属于一个特定的 Broker;
    • Broker 之间通过 ZooKeeper 进行协调,确保集群的一致性和高可用性。
  2. Topic(主题)
    • 数据按照主题进行组织,每个主题可以有多个分区。
    • 生产者将数据发送到特定主题的分区,消费者从特定主题的分区读取数据。
  3. Partition(分区)
    • 每个主题被分成若干个分区,每个分区是一个有序的、不可变的消息队列;
    • 分区的存在使得数据可以并行处理,提升了系统的吞吐量和处理能力。

Kafka 的水平扩展能力体现在以下几个方面:

  • 可以随时向: Kafka 集群中添加新的 Broker;
  • 通过增加分区数量,可以提升并行处理能力;
  • 新分区可以分配到现有、或新加入的 Broker 上,从而分散负载,提高系统的吞吐量。

通过这些机制,Kafka 实现了高效的分布式数据存储和处理,能够在大规模数据流环境中保持高性能。

 

高效的网络和异步处理

Kafka 的二进制协议设计简洁,减少了数据序列化和反序列化的开销,提高了网络传输效率。

以及,通过支持多种压缩算法(如 GZIP、Snappy、LZ4),Kafka 可以在网络传输、和磁盘存储时减少数据量。

生产者和消费者可以以异步方式发送和接收消息,允许并行处理多个请求,从而提高整体吞吐量和响应速度。

通过这些优化技术,共同造就了 Kafka 的高性能。

陈睿mikechen

十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法