kafka为什么这么快?

ops/2025/2/24 9:26:43/

前言

  Kafka的高效有几个关键点,首先是顺序读写。磁盘的顺序访问速度其实很快,甚至比内存的随机访问还要快。Kafka在设计上利用了这一点,将消息顺序写入日志文件,这样减少了磁盘寻道的时间,提高了吞吐量。与传统数据库的随机读写性能相比,性能大大提升了。
  然后是零拷贝技术(Zero-Copy),通常数据从磁盘到网络需要多次拷贝,比如从磁盘到内核缓冲区,再到用户空间,再回到内核缓冲区,最后到网络。Kafka通过sendfile系统调用,避免了用户空间和内核空间之间的数据拷贝,减少了CPU开销和数据复制时间。
  分区分段和索引,能够精准定位读取的数据。其中批量处理和压缩也是关键因素,生产者可以批量发送消息,减少网络请求次数;消费者也可以批量拉取数据。压缩减少了数据传输量,节省带宽。另外,Kafka的高效存储格式和页缓存(Page Cache)的利用也很重要。
  批量处理和压缩也是关键因素。生产者可以批量发送消息,减少网络请求次数;消费者也可以批量拉取数据。压缩减少了数据传输量,节省带宽。用户可能关心在实际应用中如何配置批量大小和压缩算法,以及这对性能的具体影响。
  分布式架构和水平扩展能力也是Kafka快的原因之一。通过分区分布在多个Broker上,Kafka可以并行处理读写请求,提高整体吞吐量。用户可能想知道如何设计分区策略来最大化性能,或者如何处理节点的扩展和故障转移。
  另外,消费者组的并行消费机制也很重要。每个分区只能被消费者组内的一个消费者消费,这样多个消费者可以同时处理不同分区的数据,提高处理速度。用户可能关心如何合理分配分区和消费者,以优化消费速度。
  Kafka 之所以能够实现极高的吞吐量和低延迟,主要得益于其独特的设计哲学和多项底层技术优化。以下是 Kafka 高性能的核心原因及其实现细节,往下阅读便可知。

一、顺序磁盘读写

核心思想:
  充分利用磁盘顺序读写的性能优势,避免随机 I/O 的开销。

  1. 顺序写入(Append-Only Log)
    • Kafka 将消息按顺序追加到日志文件末尾,避免磁盘磁头的随机寻址。
    • 即使机械硬盘(HDD)顺序写入的吞吐量也可达到数百 MB/s,接近内存操作的性能。
  2. 顺序读取
    • 消费者按顺序读取消息,无需随机跳转磁盘位置。
    • 操作系统(OS)的预读(Read-ahead)机制会自动预加载后续数据块,减少磁盘 I/O 次数。
  3. 对比传统数据库
    • 传统数据库依赖 B+ 树等结构实现随机读写,导致频繁磁盘寻址,性能较低。
    • Kafka 的日志结构设计牺牲了部分随机访问能力,换取了极高的顺序吞吐量。

二、零拷贝(Zero-Copy)技术

核心思想:
  跳过用户态与内核态之间的数据拷贝,直接通过内核缓冲区传输数据。

  1. 传统数据拷贝流程

磁盘 → 内核缓冲区 → 用户缓冲区 → Socket 缓冲区 → 网络

涉及 4 次上下文切换和 2 次数据拷贝,CPU 开销大。

  1. Kafka 的零拷贝优化
  • 使用 sendfile 系统调用(Linux)或 FileChannel.transferTo(Java NIO),将数据直接从**文件系统页缓存(Page Cache)**传输到网络通道:

磁盘 → 内核缓冲区(Page Cache)→ 网络

  使用 sendfile 系统调用(Linux)或 FileChannel.transferTo(Java NIO),将数据直接从**文件系统页缓存(Page Cache)**传输到网络通道:

磁盘 → 内核缓冲区(Page Cache)→ 网络

优势:

  • 减少 2 次数据拷贝(用户态与内核态之间)。
  • 减少 CPU 中断和上下文切换次数。

三、分区分段与索引机制

  1. 分区(Partition)
  • 每个 Topic 划分为多个 Partition,实现并行读写。
  • 不同 Partition 可分布在多个 Broker 上,水平扩展吞吐量。
  1. 分段(Segment)
  • 每个 Partition 的日志文件按大小或时间切割为多个 Segment(如 1GB 一个文件)。
  • 优势:
    • 旧 Segment 可被删除或归档,避免单个文件过大。
    • 快速定位消息:通过索引文件直接跳转到目标 Segment。
  1. 稀疏索引(Sparse Index)
  • 每个 Segment 对应一个索引文件(.index),记录消息的 Offset 和物理位置(Position)。
  • 索引文件采用稀疏存储(每隔一定消息量建一个索引点),占用空间小,但能快速定位附近位置。

四、批量处理与压缩

  1. 生产者批量发送
  • 生产者(Producer)将多条消息合并为一个批次(Batch)发送,减少网络请求次数。
  • 参数配置:
linger.ms=5       // 批次等待时间(毫秒)
batch.size=16384  // 批次大小(字节)
  1. 消费者批量拉取
  • 消费者(Consumer)一次拉取多个消息,减少网络往返开销。
  • 参数配置:
fetch.min.bytes=1        // 最小拉取数据量
fetch.max.wait.ms=500    // 拉取等待时间
  1. 消息压缩
  • 支持 GZIP、Snappy、LZ4 等压缩算法,减少网络传输和磁盘占用。
  • 压缩在 Producer 端完成,Consumer 端解压,以 Broker 不处理为原则。

五、高效存储与页缓存

  1. 存储格式优化
  • 消息按二进制格式紧凑存储,避免序列化/反序列化开销。
  • 消息按批次写入,减少磁盘 I/O 次数。
  1. 页缓存(Page Cache)
  • Kafka 依赖操作系统的页缓存管理数据,而非自行维护缓存。
  • 优势:
    • 避免 JVM 堆内存的 GC 开销。
    • 利用 OS 的缓存策略(如 LRU),自动将热点数据保留在内存中。

六、分布式架构与水平扩展

  1. Broker 集群
  • 数据分片(Partition)分布在多个 Broker 上,负载均衡。
  • 支持动态扩容:新增 Broker 后,Partition 可重新分配。
  1. 副本机制(Replication)
  • 每个 Partition 有多个副本(Replica),保障高可用。
  • Leader 副本处理读写请求,Follower 副本异步同步数据。
  1. 生产者负载均衡
  • 生产者根据 Key 或轮询策略将消息发送到不同 Partition,避免单点瓶颈。

七、消费者组(Consumer Group)并行消费

  • 每个 Partition 只能被 Consumer Group 中的一个 Consumer 消费。
  • 多 Consumer 并行消费不同 Partition,实现水平扩展。

八、性能数据对比

在这里插入图片描述

九、适用场景与权衡

  • 适用场景:
    • 高吞吐、低延迟的日志收集、流处理、事件溯源等。
  • 代价:
    • 不适合频繁随机访问的场景(如 OLTP 数据库)。
    • 消息延迟通常在毫秒级,若需微秒级延迟需特殊优化(如禁用批量发送)。

总结

  Kafka 的高性能源于多项设计优化:

  1.顺序 I/O 替代随机 I/O,最大化磁盘吞吐。
  2.零拷贝 减少 CPU 和内存开销。
  3.分区分段 实现并行处理与快速定位。
  4.批量与压缩 降低网络和磁盘压力。
  5.分布式架构 支持水平扩展。

这些技术共同作用,使 Kafka 成为处理海量实时数据的首选消息系统。


http://www.ppmy.cn/ops/160934.html

相关文章

《Keras 2 :使用 RetinaNet 进行对象检测》:此文为AI自动翻译

《Keras 2 :使用 RetinaNet 进行对象检测》 作者:Srihari Humbarwadi 创建日期:2020/05/17 最后修改日期:2023/07/10 描述:实施 RetinaNet:用于密集对象检测的焦点损失。 (i) 此示例使用 Keras 2 在 Colab 中查看 • 介绍 目标检测是计算机中非常重要的问题 视觉。在…

Linux-Ansible模块完结

文章目录 User和GroupHostname、Cron、Yum和Service 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月23日19点59分 User和Group User和Group模块实践 ansible 192.168.1.100 -m …

迎接DeepSeek开源周[Kimi先开为敬]发布开源最新Muon优化器可替代 AdamW

Muon优化器在小规模语言模型训练中表现出色,但在大规模模型训练中的可扩展性尚未得到证实。月之暗面通过系统分析和改进,成功将 Muon 应用于 3B/16B 参数的 MoE 模型训练,累计训练 5.7 万亿 token。结果表明,Muon 可以替代 AdamW …

【杂谈】-强化学习遇见链式思维:将大型语言模型转变为自主推理代理

强化学习遇见链式思维:将大型语言模型转变为自主推理代理 文章目录 强化学习遇见链式思维:将大型语言模型转变为自主推理代理1、LLMs中自主推理的必要性1.1 传统LLMs的局限性1.2 链式思维(CoT)提示的不足1.3 推理中强化学习的必要…

DeepSeek写贪吃蛇手机小游戏

DeepSeek写贪吃蛇手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端贪吃蛇H5文件: 要求 蛇和食物红点要清晰,不超过屏幕外 下方有暂停和重新…

第二周补充:Go语言中取地址符与fmt函数详解

第二周补充:Go语言中&取地址符与fmt函数详解 在Go语言中,& 是取地址符,用于获取变量的内存地址。具体到代码 fmt.Scanln(&celsius) 中: 作用:&celsius 获取变量 celsius 的内存地址,使得 …

ESP32S3:解决RWDT无法触发中断问题,二次开发者怎么才能使用内部RTC看门狗中断RWDT呢?

目录 基于ESP32S3:解决RWDT无法触发中断问题引言解决方案1. 查看报错日志2. 分析报错及一步一步找到解决方法3.小结我的源码基于ESP32S3:解决RWDT无法触发中断问题 引言 在嵌入式系统中,RWDT(看门狗定时器)是确保系统稳定性的重要组件。然而,在某些情况下,RWDT可能无法…

Pytorch使用手册-音频特征提取(专题二十一)

音频特征提取 torchaudio 实现了音频领域常用的特征提取方法。它们可在 torchaudio.functional 和 torchaudio.transforms 模块中找到。 functional 以独立函数的形式实现特征提取方法,它们是无状态的。transforms 以对象的形式实现特征提取方法,基于 functional 和 torch.n…