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

相关推荐
DachuiLi1 小时前
McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构
kafka
weisian1515 小时前
Redis篇--常见问题篇7--缓存一致性2(分布式事务框架Seata)
redis·分布式·缓存
不能只会打代码6 小时前
Java并发编程框架之综合案例—— 分布式日志分析系统(七)
java·开发语言·分布式·java并发框架
Elastic 中国社区官方博客6 小时前
如何通过 Kafka 将数据导入 Elasticsearch
大数据·数据库·分布式·elasticsearch·搜索引擎·kafka·全文检索
马剑威(威哥爱编程)7 小时前
分布式Python计算服务MaxFrame使用心得
开发语言·分布式·python·阿里云
学计算机的睿智大学生8 小时前
Hadoop的生态系统所包含的组件
大数据·hadoop·分布式
神秘打工猴10 小时前
Kafka 监控都有哪些?
分布式·kafka
Kobebryant-Manba11 小时前
kafka基本概念
分布式·学习·kafka
rainoway12 小时前
CRDT宝典 - yata算法
前端·分布式·算法