关于 Kafka 高性能架构,这篇说得最全面,建议收藏!

简介: Kafka 是一个高吞吐量、高性能的消息中间件,关于 Kafka 高性能背后的实现,是大厂面试高频问题。本篇全面详解 Kafka 高性能背后的实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。

关注△mikechen的互联网架构△,10年+BAT架构经验倾囊相授


image.png

大家好,我是 mikechen | 陈睿

Kafka 是一个高吞吐量、高性能的消息中间件,关于 Kafka 高性能背后的实现,是大厂面试高频问题。

本篇,我们全面详解 Kafka 高性能背后的实现。@mikechen

高性能顺序写

首先,Kafka采用顺序写入,可以极大的提升性能。

什么是“顺序写入”?指的是将数据按照顺序写入磁盘,而不是随机写入。

顺序写入的操作方式,可以优化磁盘的 I/O 性能,因为磁盘连续写入的数据更快。

为什么更快呢?你需要深入了解磁盘IO的运行机制。

如下图所示:

image.png

如果你要写入数据,首先需要磁盘“寻道”,“寻道”就是磁盘磁头移动到目标轨道。

如果采用“随机写”,需要磁头在磁盘上来回移动,增加了寻道时间,降低了性能。

而采用顺序写入,通常不需要频繁移动磁头,磁头可以沿着相同的轨道顺序写入数据,减少了寻道时间。

所以,Kafka 在磁盘上,通过追加写入日志文件,这样每次写入操作都在文件末尾进行,而不是更新文件的任意位置。

如下图所示:

image.png

顺序写入将数据,写入到相邻的磁盘块中,保持数据的物理连续性,减少磁头移动。

顺序写入,使得数据在磁盘上的物理位置连续,从而减少了磁头移动、和等待时间,提高了写入性能。

零拷贝

Kafka 使用零拷贝技术,来优化数据从磁盘到网络的传输过程。

这减少了数据在内存、和磁盘之间的复制次数,从而减少了 CPU 使用率和延迟。

先来看看非零拷贝的情况,如下图所示:

image.png

采用非零拷贝,大致流程如下:

  1. 数据读取:首先,数据从磁盘读取,到内核缓冲区(内核空间);
  2. 数据复制:其次,数据从内核缓冲区,复制到用户空间的缓冲区;
  3. 网络传输:如果数据需要通过网络传输,数据再次从用户空间复制到网络缓冲区。

数据在传输、和处理过程中,会经历多次内存复制操作。

每次复制都会消耗 CPU 资源、和内存带宽,增加了系统开销。

所以,如果想体系性能,就可以考虑使用零拷贝技术,如下图所示:

比如:使用 sendfile 技术,可以将文件数据,从磁盘直接传输到网络套接字,而无需将数据复制到用户空间。

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

大致工作过程,如下:

首先,传输请求

应用程序发起 sendfile 调用,请求将文件描述符中的数据发送到网络套接字;

然后,内核处理

操作系统内核,接收到 sendfile 请求后,直接在内核空间中处理数据传输。

数据从文件描述符中读取到内核缓存中,再从内核缓存中写入到网络套接字,而无需将数据拷贝到用户空间。

最后,数据传输

数据在内核空间中完成读取和写入操作,从而避免了用户空间到内核空间的多次内存复制。

页缓存技术

Kafka 的高性能,与操作系统的页缓存(Page Cache)密切相关,理解这一点可以帮助更深入地认识 Kafka 。

我们一起来看Kafka的写入过程,如下图所示:

image.png

当 Kafka 生产者将数据写入主题时,这些数据首先被写入页缓存,而不是直接写入磁盘。

操作系统会将数据缓存到内存中,随后再将其异步地写入磁盘,比如:采用定期的策略等。

为什么要这样来实现呢?原因很简单:就是内存的访问速度,远快于磁盘。

通过这种机制,Kafka 利用内存的高速特性来优化数据写入,同时减少了对磁盘的直接 I/O 操作。

Kafka 通过批量操作将数据合并写入页缓存,减少了磁盘写入的次数,从而,进一步提升了系统吞吐量。

高效的网络设计

Kafka 使用了高效的网络协议,来减少网络开销。

比如:

Kafka 的协议使用了高效的序列化和反序列化机制,减少了网络传输的数据量和处理延迟。

Kafka 支持对消息进行压缩(如 :GZIP、Snappy、LZ4....... 等),通过压缩减少存储空间的占用、和网络传输的开销。

这减少了磁盘 I/O 和网络带宽的消耗,提高了总体性能。

以上,是 Kafka 高性能架构的详细解析,欢迎评论区留言交流或拓展。

我是 mikechen | 陈睿 ,关注【mikechen的互联网架构】,10年+BAT架构技术倾囊相授。

新的架构专题内容,第一时间更新至:阿里架构师进阶全部合集

本文已同步我的技术博客 www.mikechen.cc,更新至我原创的《30W+字阿里架构技术合集》中。

相关文章
|
1月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
1月前
|
消息中间件 存储 负载均衡
【赵渝强老师】Kafka的体系架构
Kafka消息系统是一个分布式系统,包含生产者、消费者、Broker和ZooKeeper。生产者将消息发送到Broker,消费者从Broker中拉取消息并处理。主题按分区存储,每个分区有唯一的偏移量地址,确保消息顺序。Kafka支持负载均衡和容错。视频讲解和术语表进一步帮助理解。
|
2月前
|
消息中间件 NoSQL Kafka
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
70 5
|
2月前
|
消息中间件 存储 分布式计算
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
79 4
|
2月前
|
机器学习/深度学习 存储 人工智能
用60%成本干80%的事,DeepSeek分享沉淀多年的高性能深度学习架构
【10月更文挑战第2天】近年来,深度学习(DL)与大型语言模型(LLMs)的发展推动了AI的进步,但也带来了计算资源的极大需求。为此,DeepSeek团队提出了Fire-Flyer AI-HPC架构,通过创新的软硬件协同设计,利用10,000个PCIe A100 GPU,实现了高性能且低成本的深度学习训练。相比NVIDIA的DGX-A100,其成本减半,能耗降低40%,并在网络设计、通信优化、并行计算和文件系统等方面进行了全面优化,确保系统的高效与稳定。[论文地址](https://arxiv.org/pdf/2408.14158)
73 4
|
3月前
|
机器学习/深度学习 测试技术 数据处理
KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
Kolmogorov-Arnold网络(KAN)作为一种多层感知器(MLP)的替代方案,为深度学习领域带来新可能。尽管初期测试显示KAN在时间序列预测中的表现不佳,近期提出的可逆KAN混合模型(RMoK)显著提升了其性能。RMoK结合了Wav-KAN、JacobiKAN和TaylorKAN等多种专家层,通过门控网络动态选择最适合的专家层,从而灵活应对各种时间序列模式。实验结果显示,RMoK在多个数据集上表现出色,尤其是在长期预测任务中。未来研究将进一步探索RMoK在不同领域的应用潜力及其与其他先进技术的结合。
110 4
|
4月前
|
消息中间件 负载均衡 Java
揭秘Kafka背后的秘密!Kafka 架构设计大曝光:深入剖析Kafka机制,带你一探究竟!
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理及流传输设计的高效率消息系统。其核心特性包括高吞吐量、低延迟及出色的可扩展性。Kafka采用分布式日志模型,支持数据分区与副本,确保数据可靠性和持久性。系统由Producer(消息生产者)、Consumer(消息消费者)及Broker(消息服务器)组成。Kafka支持消费者组,实现数据并行处理,提升整体性能。通过内置的故障恢复机制,即使部分节点失效,系统仍能保持稳定运行。提供的Java示例代码展示了如何使用Kafka进行消息的生产和消费,并演示了故障转移处理过程。
56 3
|
4月前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
117 0
|
2月前
|
消息中间件 存储 运维
为什么说Kafka还不是完美的实时数据通道
【10月更文挑战第19天】Kafka 虽然作为数据通道被广泛应用,但在实时性、数据一致性、性能及管理方面存在局限。数据延迟受消息堆积和分区再平衡影响;数据一致性难以达到恰好一次;性能瓶颈在于网络和磁盘I/O;管理复杂性涉及集群配置与版本升级。
102 1
|
2月前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
53 1