kafka为什么这么快?

房东的猫 提交于 2020-01-23 18:33:19

 

顺序读写

Kafka的消息是不断追加到文件中的,这个特性使它可以充分利用磁盘的顺序读写能力。
顺序读写降低了硬盘磁头的寻道时间,只需要很少的扇区旋转时间,所以速度远快于
随机读写。Kafka官方给出的测试数据(Raid-5, 7200rpm)
顺序I/O: 600MB/s
随机I/O: 100KB/s

零拷贝

先简单的了解下文件系统的操作流程,例如一个程序要把文件内容发送到网络。这个过程发生在用户空间,文件和网络socket属于硬件资源,两者之间有一个
内核空间,在操作系统内部,整个过程为:
图片
在Linux Kernal 2.2之后出现了一种叫做“零拷贝(zero-copy)”系统调用机制,就是跳过“用户缓冲区”的拷贝,建立一个磁盘空间和内存空间的直接映射,数据不再复制到“用户态缓冲区”。系统上下文切换减少2次,可以提升一倍性能
图片

文件分段

Kafka的队列topic被分为了多个区partition, 每个partition又分为了多个segment,所以一个队列中的消息实际上是保存在N多个片段文件中,通过分段的方式,每次文件操作都是对一个小文件的操作,非常轻便,同时也增加了并行处理能力
图片

批量发送

Kafka允许进行批量消息发送,先将消息缓存在内存中,然后一次请求批量发送出去,比如可以指定缓存的消息达到某个量的时候发送,或者缓存了固定的时间后发送。这种策略大大减少了服务器端的I/O次数

数据压缩

Kafka还支持消息压缩,Producer可以通过GZIP或者Snappy格式对消息集合进行压缩,从而减少网络传输的压力

offset机制

不管什么方法,有效就是好方法
Kafka不保存消息的状态,即消息是否被“消费”。一般的消息系统需要保存消息的状态,并且还需要以随机访问的形式更新消息的状态。而Kafka 的做法是保存Consumer在Topic分区中的位置offset,在offset之前的消息是已被“消费”的,在offset之后则为未“消费”的,并且offset是可以任意移动的,这样就消除了大部分的随机IO。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!