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

相关推荐
未秃头的程序猿7 分钟前
从零到一:深入浅出分布式锁原理与Spring Boot实战(Redis + ZooKeeper)
spring boot·分布式·后端
eSsO KERF2 小时前
RabbitMQ之交换机
分布式·rabbitmq·ruby
Albert Edison2 小时前
【RabbitMQ】Topics 通配符模式(使用案例)
分布式·rabbitmq
yaoyouzhong11 小时前
分布式与集群,二者区别是什么?
分布式
橙露12 小时前
SpringBoot 整合 MinIO:分布式文件存储上传下载
spring boot·分布式·后端
Ulyanov14 小时前
Apache Kafka在雷达仿真数据流处理中的应用
分布式·python·kafka·apache·雷达电子战
路飞说AI16 小时前
Kafka: 一条消息的完整“生命之旅”
kafka
Ssan PRIN17 小时前
深度掌握 RabbitMQ 消息确认(ACK)机制,确保消息万无一失
分布式·rabbitmq
切糕师学AI17 小时前
深入理解 CAP 定理:分布式系统中的一致性、可用性与分区容错
分布式·cap
indexsunny18 小时前
互联网大厂Java面试实战:核心技术与微服务架构在电商场景中的应用
java·spring boot·redis·kafka·maven·spring security·microservices