Kafka是号称能用普通的PC机也能处理超千万亿的消息吞吐量的实时信息流处理平台。Kafka之所以能够支持如此大的吞吐量而且还能够做到性能优秀的主要原因有四个:
1、磁盘顺序读写
2、稀疏索引
3、批量文件压缩
4、零拷贝机制
磁盘顺序读写
如果要读写数据,必须找到数据对应的扇区,这个过程叫寻址。
如果读写的多条数据在磁盘上是分散的,寻址会很耗时,这叫随机I/O。
如果读写的数据在磁盘上是集中的,不需要重复寻址的过程,这叫顺序I/O。
Kafka的消息时不断地追加到本地磁盘的末尾的而不是随机的写入,这就使得Kafka写入的吞吐量得到了显著的提升。如果我们在一定条件下进行测试的话,磁盘的顺序读写可以达到53.2M每秒比内存的随机读写还快。
稀疏索引
Kafka的索引并不是每一条消息都会建立索引,而是一种稀疏索引。Kafka在插入一批数据的时候才会产生一条索引记录,后续利用二分查找可以去找到对应的数据,这样的话可以大大提高检索效率。
批量文件压缩
Kafka默认是不会删除数据的,它会把所有的消息变成一个批量的文件,它会把多次插入相同的Key对应的Value合并成为最后一次插入的Value,这样的话就可以对消息进行合理的批量压缩,从而减少对网络IO的消耗。
零拷贝
操作系统的虚拟内存分为两部分,一部分叫内核空间,一部分叫用户空间。这样的话就可以避免用户进程直接去操作内核,从而保证内核的安全。正常情况下,如果用户从磁盘读取数据就必须把数据从磁盘拷贝到内核的缓冲区,然后再从内核的缓冲区拷贝到用户的缓冲区,最后才能去返回给用户。Linux系统里面提供了一个叫做sendfile的函数,它可以去实现零拷贝。它不需要经过用户的缓冲区就可以直接把数据发送到网卡,而Kafka的文件传输最终调用的是Java NIO里面的transferTo方法。实际上Java的transforTo方法最终调用的是Linux的sendfile()函数,所以就可以实现零拷贝。零拷贝技术可以大大提高文件传输的性能。
网友评论