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

相关推荐
优人ovo1 小时前
Kafka的消息协议
分布式·网络协议·kafka
言之。4 小时前
【Spark速通】
大数据·分布式·spark
大秦王多鱼5 小时前
Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`
运维·分布式·kafka·apache
乙卯年QAQ7 小时前
【Hadoop】Hadoop 概述
大数据·hadoop·分布式
天选之子1237 小时前
spark运行流程
大数据·分布式·spark
李匠20247 小时前
大数据学习之Kafka消息队列、Spark分布式计算框架一
大数据·学习·kafka
想搞艺术的程序员7 小时前
Go优雅实现redis分布式锁
redis·分布式·golang
Neil Parker16 小时前
搭建Spark分布式集群
大数据·分布式·spark
WannaRunning17 小时前
Kafka生产者ACK参数与同步复制
分布式·kafka
Elastic 中国社区官方博客1 天前
Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性
大数据·分布式·elasticsearch·搜索引擎·kafka·全文检索·confluent