Kafka速度快的原因

文章目录


前言

Kafka 之所以能实现惊人的高吞吐量(单机可达每秒处理百万级消息),并不是依赖某种"黑魔法",而是因为它把计算机科学中已有的高效技术组合并发挥到了极致。

简单来说,Kafka 的设计核心是:利用操作系统的特性,把磁盘写成内存的速度,把网卡跑满。


一、顺序写入磁盘

  • 反常识的设计:通常我们认为"内存"比"磁盘"快成千上万倍,所以高性能系统都尽量用内存。但 Kafka 反其道而行之,它直接将数据写入磁盘。
  • 顺序 I/O:Kafka 将消息持久化时,采用的是追加写(Append-Only)模式。它像在日记本上写字一样,只往文件末尾添加,绝不随机修改中间的内容。
  • 优势:现代磁盘(尤其是 SSD)在进行顺序写入时,速度其实非常快,甚至接近内存的传输带宽。这避免了磁盘磁头频繁寻道(随机写)的巨大开销。

二、页缓存(PageCache)与零拷贝(Zero-Copy)

  • 页缓存(PageCache):
    • Kafka 本身不直接管理缓存,而是依赖操作系统的 PageCache。
    • 当写入数据时,数据先写入 PageCache(内存),由操作系统异步刷盘。这使得读写操作几乎都是在内存中完成的,速度极快。
    • 好处:避免了 JVM 堆内存的垃圾回收(GC)停顿,且重启后缓存依然有效。
  • 零拷贝(Zero-Copy):
    • 传统文件传输:磁盘 -> 内核缓冲区 -> 用户缓冲区(JVM) -> Socket 缓冲区 -> 网卡。中间涉及 4 次拷贝和多次上下文切换。
    • Kafka 的方式:利用 Linux 的 sendfile 系统调用,数据直接从磁盘通过 DMA 传输到网卡,中间不经过 Kafka 服务(用户态)。这大大减少了 CPU 开销和内存带宽占用,专门为了把网卡带宽跑满。

三、批量处理与压缩(减少网络和 I/O 次数)

  • 批量发送/拉取:生产者(Producer)不会发一条消息就立刻送走,而是先在内存里攒成一个批次(Batch),达到一定大小或时间后,一次性发送。消费者(Consumer)也是一次性拉取一批数据。
  • 数据压缩:Kafka 支持对整个批次进行压缩(如 Snappy, LZ4)。因为批次数据量大且有重复性,压缩率很高。这使得在网络传输和磁盘存储时,数据量大幅减小,进一步提升了吞吐量。

四、分区(Partition)并行机制

Kafka 将一个 Topic 拆分成多个 Partition,分布到不同的 Broker(服务器)上。

  • 并行读写:每个 Partition 都是一个独立的队列。生产者可以同时向多个 Partition 写入,消费者组可以同时从多个 Partition 读取。
  • 水平扩展:随着数据量增加,你只需要增加更多的服务器(Broker)和 Partition,Kafka 的吞吐量就能线性增长。

总结

Kafka 快的原因可以概括为:顺序 I/O 替代随机 I/O,零拷贝替代传统搬运,批量压缩减少传输量,并行分区利用集群算力。

相关推荐
一条泥憨鱼8 小时前
【Kafka】零基础学习教程
java·分布式·学习·kafka
96245610 小时前
补打一条卡,为什么要从前一天重新算:人工补录与实时重算业务复盘
java·mysql·kafka
贾伟康10 小时前
【共创稿事节】HarmonyOS 7.0 HiTraceChain分布式调用链:从接入到生产验证
分布式·harmonyos·可观测性·调用链·hitracechain
RobinXYuan1 天前
【Kafka 源码手记】05 Broker 网络层与请求处理(中):Processor 事件循环与线上的字节
kafka·源码阅读
NiceZack1 天前
Hadoop 部署全流程教程:从新装 CentOS 到伪分布式与完全分布式
hadoop·分布式·centos
傻啦嘿哟1 天前
分布式爬虫架构:Redis+Scrapy打造企业级爬虫系统
分布式·爬虫·架构
坐吃山猪1 天前
Kafka13-自定义分区器
kafka
starzy19901 天前
Kafka请求进门口:Processor是怎么把请求读上来的
分布式·kafka
骑着蜗牛撵大象3272 天前
558 万美元训出 671B 模型:DeepSeek-V3 算法与系统的协同拆解
分布式·算法·moe·deepseek-v3·mla·fp8训练
德迅云安全-上官2 天前
德迅游戏盾:面向 TCP 业务的分布式云安全防护方案
分布式·tcp/ip·游戏