Kafka是分散式讯息系统,需要处理海量的讯息,Kafka的设计是把所有的讯息都写入速度低容量大的硬盘,以此来换取更强的储存能力,但实际上,使用硬盘并没有带来过多的效能损失。
kafka主要使用了以下几个方式实现了超高的吞吐率
顺序读写kafka的讯息是不断追加到档案中的,这个特性使kafka可以充分利用磁盘的顺序读写效能。
顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写。
Kafka官方给出了测试资料(Raid-5,7200rpm):
> 顺序 I/O: 600MB/s
> 随机 I/O: 100KB/s
零拷贝
先简单了解下档案系统的操作流程,例如一个程式要把档案内容传送到网络,这个程式是工作在使用者空间,档案和网络socket属于硬件资源,两者之间有一个核心空间在操作系统内部,整个过程为:
在Linux kernel2.2 之后出现了一种叫做零拷贝(zero-copy)系统呼叫机制,就是跳过“使用者缓冲区”的拷贝,建立一个磁盘空间和内存的直接对映,资料不再复制到“使用者态缓冲区”。
系统上下文切换减少为2次,可以提升一倍的效能。
档案分段
kafka的伫列topic被分为了多个区partition,每个partition又分为多个段segment,所以一个伫列中的讯息实际上是储存在N多个片段档案中。
通过分段的方式,每次档案操作都是对一个小档案的操作,非常轻便,同时也增加了并行处理能力。
批量传送
Kafka允许进行批量传送讯息,先将讯息快取在内存中,然后一次请求批量传送出去。
比如可以指定快取的讯息达到某个量的时候就发出去,或者快取了固定的时间后就传送出去,如100条讯息就传送,或者每5秒传送一次,这种策略将大大减少服务端的I/O次数。
资料压缩
Kafka还支援对讯息集合进行压缩,Producer可以通过GZIP或Snappy格式对讯息集合进行压缩。
压缩的好处就是减少传输的资料量,减轻对网络传输的压力,Producer压缩之后,在Consumer需进行解压,虽然增加了CPU的工作,但在对大资料处理上,瓶颈在网络上而不是CPU,所以这个成本很值得。
好了,今天就简单分享下kafka讯息伫列实现高吞吐的原因,尽请关注,后续有更精彩内容分享,谢谢。