Kafka为啥读写数据效率这么高?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka为啥读写数据效率这么高?相关的知识,希望对你有一定的参考价值。

参考技术A

数据文件分段并建立索引,可以直接定位到每条数据,把普通的随机IO变成了顺序IO,提高了效率。

Topic主题 & Partition分区存储数据

Topic 在逻辑上可以被认为是一个 queue,每条消费都必须指定它的 Topic,可以简单理解为必须指明把这条消息放进哪个 queue 里。为了使得 Kafka 的吞吐率可以线性提高,物理上把 Topic 分成一个或多个 Partition,每个 Partition 在物理上对应一个文件夹,该文件夹下存储这个 Partition 的所有消息和索引文件。

每个日志文件都是一个 log entrie 序列,每个 log entrie 包含一个 4 字节整型数值(值为 N+5),1 个字节的 "magic value",4 个字节的 CRC 校验码,其后跟 N 个字节的消息体。每条消息都有一个当前 Partition 下唯一的 64 字节的 offset,它指明了这条消息的起始位置。磁盘上存储的消息格式如下:

这个 log entries 并非由一个文件构成,而是分成多个 segment,每个 segment 以该 segment 第一条消息的 offset 命名并以“.kafka”为后缀。另外会有一个索引文件,它标明了每个 segment 下包含的 log entry 的 offset 范围,如下图所示。

因为每条消息都被 append 到该 Partition 中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是 Kafka 高吞吐率的一个很重要的保证)。

Kafka性能与存储的数据文件大小无关

对于传统的 message queue 而言,一般会删除已经被消费的消息,而 Kafka 集群会保留所有的消息,无论其被消费与否。
因为 Kafka 读取特定消息的时间复杂度为 O(1),即与文件大小无关,所以这里删除过期文件与提高 Kafka 性能无关。

以上是关于Kafka为啥读写数据效率这么高?的主要内容,如果未能解决你的问题,请参考以下文章

聊聊 Kafka: Kafka 为啥这么快?

为啥数据库读写分离能提高数据库的性能?

吃透Kafka二:kafka高性能之顺序IO页缓存零拷贝

吃透Kafka二:kafka高性能之顺序IO页缓存零拷贝

基于磁盘的Kafka为什么这么快

同样是消息队列,为什么Kafka这么快?