- 首先,Kafka 作为一个消息系统,通过 topic 的方式来管理 message,把这些消息都顺序写入磁盘文件来提高写入速度,其实这些消息并没有实时写入磁盘,而是充分利用了现代操作系统分页存储来利用内存提高IO效率。
- 其次,它的工作原理是直接利用操作系统的 page 来实现文件到物理内存的直接映射。完成映射之后你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。
- 再次,Kafka 也基于 sendfile 实现 zero copy(零拷贝机制),简化网络上和两个本地文件之间的数据传输,sendfile 的引入不仅减少了数据复制,还减少了上下文切换。
- 最后,Kafka 为了能网络上提高传输数据的效率,message 也支持压缩。在很多情况下,系统的瓶颈不是 CPU 或磁盘,而是网络 IO,对于需要在广域网上的数据中心之间发送消息的数据流水线尤其如此。
- 总结:Kafka 速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络 IO 损耗,通过 mmap 提高 IO 速度,写入数据的时候由于单个 partition 是末尾添加所以速度最优;读取数据的时候配合 sendfile 直接暴力输出。