Kafka为什么这么快?

Kafka 是一个号称能用普通PC机也能处理超千万亿吞吐量的实时消息平台,之所以能够做到这些,主要原因有四个:

一 、 磁盘的顺序读写

在讲磁盘顺序读写之前,我们先来了解一下磁盘的寻址的过程。在磁盘的构造中,磁道是指磁头在磁盘的表面画出一个圆形的轨迹。在磁盘中,从内到外半径不同会有很多的磁道,用不同的半径线,把磁道划分成多个扇区。如果要读写数据,必须找到数据对应的扇区,这个过程就叫寻址。如果读写的多条数据在磁盘上是分散存储的,寻址会很耗时,这叫随机I/O。如果读写的数据在磁盘上是集中的,不需要重复的寻址,这叫顺序I/O。Kafka的消息是不断的追加到本地磁盘上的末尾的,而不是随机的写入,那么这使得Kafka写入的吞吐量就得到了显著的提升。在一定条件下进行测试,磁盘的顺序读写可以达到53,2M每秒,比内存的随机读写还要快。

二 、 稀疏索引

Kafka 并不是对每条消息都会建立一个索引的,而是采用了一种稀疏索引的方式,Kafka 在插入一批致据的时候,才会产生一条索引记录,然后利用二分查找,去找对应的数据,这样可大大提高检索效率。

三 、批量文件压缩

Kalka 会把所有的消息变成一个批量的文件,这样就可以对消息进行合理的批量压缩,从而减少对网络I/O的损耗。

四 、零拷贝机制

操作系统的虚拟内存分为两部分,一部分是内核空间,另一部分是用户空间。这样可以避免用户进程直接去操作内核,从而去保证内核的安全。正常情况下,如果用户要去从磁盘读取数据,就必需要把数据从磁盘拷贝到内核的缓冲区,然后再从内核的缓冲区到用户的缓冲区,最后才能去返回给用户,在 Linux系统里面提供了一个叫做sendfile 的函致,它可以去实现零拷贝,也就是说,它不需要经过用户的缓冲区,就可以直接把致据发送到网卡,而 Kafka 的文件传输,最终调用的是 Java NIO 里面的transferTo 方法,实际上 Java 的 transferTo 方法,最终调用的是 Linux 的 sendfile() 函数,所以就可以实现零拷贝。这技术可大大提高文件传输的性能。

相关推荐
知识搬运临时工14 小时前
Kafka 发 1 GiB 数据,用户态 CPU 只花 0.016 秒,总耗时反而慢了 11%
后端·kafka
方方洛14 小时前
ray教程-25-附录E-端到端实战案例
人工智能·分布式·机器学习
一条泥憨鱼2 天前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
斯普信专业组2 天前
Kafka 消费者 poll() 流程与原理详解
kafka·流程图
迅翼SwiftWing2 天前
编队系列(二)|固定翼如何依靠邻居信息保持队形?一致性控制、通信拓扑与分布式仿真实现,附仿真代码
分布式
ly76892 天前
幂等消费者与重试副作用:Kafka 端点接入时的去重边界
分布式·kafka·linq·apache camel·幂等消费者·重试副作用·去重边界
qq_452396232 天前
第三篇:《从 ZooKeeper 到 KRaft 的迁移实战:前置条件、三阶段流程与回滚策略》
分布式·zookeeper·云原生
真上帝的左手3 天前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis
程序猿乐锅3 天前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight