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() 函数,所以就可以实现零拷贝。这技术可大大提高文件传输的性能。

相关推荐
yumgpkpm1 分钟前
(简略)AI 大模型 手机的“简单替换陷阱”与Hadoop、Cloudera CDP 7大数据底座的关系探析
人工智能·hive·zookeeper·flink·spark·kafka·开源
Cat God 0071 分钟前
Kafka单机搭建(一)
分布式·kafka
yumgpkpm1 分钟前
Cloudera CDP 7.3下载地址、方式,开源适配 CMP 7.3(或类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版)值得推荐
大数据·hive·hadoop·分布式·华为·开源·cloudera
Chasing__Dreams3 分钟前
kafka--基础知识点--6.3--leader epoch机制
分布式·kafka
L、2184 分钟前
Flutter 与 OpenHarmony 深度集成:构建分布式多端协同应用
分布式·flutter·wpf
Light608 小时前
点燃变革:领码SPARK融合平台如何重塑OA,开启企业智慧协同新纪元?
大数据·分布式·spark
写代码的【黑咖啡】9 小时前
如何在大数据数仓中搭建数据集市
大数据·分布式·spark
SoleMotive.11 小时前
kafka选型
分布式·kafka
小二·13 小时前
MyBatis基础入门《十五》分布式事务实战:Seata + MyBatis 实现跨服务数据一致性
分布式·wpf·mybatis
feathered-feathered15 小时前
Redis基础知识+RDB+AOF(面试)
java·数据库·redis·分布式·后端·中间件·面试