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,零拷贝替代传统搬运,批量压缩减少传输量,并行分区利用集群算力。

相关推荐
Albert Edison2 分钟前
【RabbitMQ】发布确认模式(使用案例)
分布式·rabbitmq·ruby
EXnf1SbYK1 小时前
Redis分布式锁进阶第十二篇:全系列终极兜底复盘 + 锁架构巡检落地 + 线上零事故收尾方案
redis·分布式·架构
EXnf1SbYK2 小时前
Redis分布式锁进阶第八篇:锁超时乱序深度踩坑 + 看门狗失效真实溯源 + 业务长耗时标准化兜底方案
数据库·redis·分布式
EXnf1SbYK2 小时前
Redis分布式锁进阶第十一篇
数据库·redis·分布式
biyezuopinvip3 小时前
分布式风电场低电压穿越故障建模与仿真
分布式·matlab·毕业设计·毕业论文·分布式风电场·低电压穿越故障·建模与仿真
苍煜3 小时前
SpringBoot单体应用到分布式下的数据库锁、事务、Redis事务、分布式锁、分布式事务协调
数据库·spring boot·分布式
fengxin_rou3 小时前
黑马点评项目万字总结:从redis基础到实战应用详解
java·开发语言·分布式·后端·黑马点评
ErizJ4 小时前
Kafka | 学习笔记
笔记·学习·kafka
小江的记录本14 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
身如柳絮随风扬21 小时前
多数据源切换实战:从业务场景到3种实现方案全解析
java·分布式·微服务