为什么 Apache Kafka 如此之快

113 阅读3分钟

介绍

Apache Kafka 是一个众所周知的开源流处理平台,旨在提供一个能够处理实时数据输入的高吞吐量、低延迟和容错平台。

那么,是什么让 Apache Kafka 成为实时数据处理的首选平台呢?除了 Kafka 提供的所有其他优势外,速度是最重要的优势之一。让我们看看 Kafka 是如何构建得如此之快的。

1. 低延迟 I/O:

  • 有两个可能的地方可用于存储和缓存数据:随机存取存储器 (RAM) 和磁盘。
  • 在传递消息时实现低延迟的正统方法是使用 RAM。它优于磁盘,因为磁盘的寻道时间长,因此速度较慢。
  • 这种方法的缺点是,当流经系统的数据约为每秒 10 到 500 GB 甚至更多时,使用 RAM 的成本可能很高。

2. Kafka 避免寻道时间:

  • Kafka 通过使用称为顺序 I/O 的概念巧妙地避免了寻道时间。
  • 它使用一种称为“日志”的数据结构,这是一种按时间排序的仅追加记录序列。日志基本上是一个队列,生产者可以将其追加到队列的末尾,订阅者可以通过维护指针自行处理消息。
  • 发布的第一条记录的偏移量为 0,第二条记录的偏移量为 1,依此类推。
  • 消费者通过访问偏移量指定的位置来消费数据。消费者定期将他们的位置保存在日志中。
  • 这也是 Kafka 成为一个容错系统,因为在当前消费者实例失败的情况下,其他消费者可以使用存储的偏移量来读取新记录。这种方法消除了磁盘寻道的需要,因为数据以如下所示的顺序方式存在:

Consumer.png

3. 零拷贝原则

  • 最常见的网络发送数据方式需要在内核态和用户态之间进行多次上下文切换,这会导致内存带宽和CPU周期的消耗。
  • 零拷贝通过请求内核将数据直接移动到响应套接字而不是通过应用程序移动来减少这种情况。通过实施零拷贝原则,Kafka 的速度得到了极大的提升。

FOi-gjZVgAQdG9B.jpeg

4. 最佳数据结构

  • 树与队列:树似乎是数据存储的首选数据结构。大多数现代数据库都使用某种形式的树数据结构。例如。 MongoDB 使用 BTree。

    • 另一方面,Kafka 不是数据库而是消息系统,因此与数据库相比,它会经历更多的读/写操作。
    • 为此使用树可能会导致随机 I/O,最终导致磁盘寻道——这在性能方面是灾难性的。
  • 它使用队列,因为所有数据都附加在末尾,并且使用指针读取非常简单。这些操作的复杂度为 O(1),从而证实了 Kafka 队列数据结构的效率。

5. 水平扩展:

  • Kafka 能够为单个主题创建多个分区,该主题可以分布在数千台机器上。这使它能够保持高吞吐量并提供低延迟。

6. 数据压缩和批处理

  • Kafka 将数据批处理成块,这有助于减少网络调用并将大部分随机写入转换为顺序写入。与压缩单个消息相比,压缩一批数据更有效。
  • Kafka 压缩一批消息并将它们发送到服务器,在那里它们以压缩形式本身写入。它们在订阅者使用时被解压缩。 Kafka 支持 GZIP 和 Snappy 压缩协议。