Apache Kafka 是一个众所周知的开源流处理平台,旨在提供一个能够处理实时数据输入的高吞吐量、低延迟和容错平台。
那么是什么让 Apache Kafka 成为实时数据处理的首选平台呢?除了 Kafka 提供的所有其他好处外,速度是最重要的好处之一。让我们看看 Kafka 是如何构建得如此之快的。
1. Low-Latency I/O:有两个可能的地方可以用来存储和缓存数据:随机存取存储器(RAM)和磁盘。
- 在传递消息时实现低延迟的一种正统方法是使用 RAM。它比磁盘更受欢迎,因为磁盘具有很高的寻道时间,从而使它们变慢。
- 这种方法的缺点是,当流经系统的数据大约为每秒 10 到 500 GB 甚至更多时,使用 RAM 可能会很昂贵。
因此,Kafka 依赖文件系统来存储和缓存消息。虽然它使用磁盘方法而不是 RAM 方法,但它仍然设法实现低延迟!鉴于寻道时间很长,您可能想知道这怎么可能。让我们来了解一下。
2. Kafka 避免了搜索时间:是的! Kafka 通过使用称为 Sequential I/O的概念巧妙地避免了寻道时间。
- 它使用一种称为“log”的数据结构,它是一个仅附加的记录序列,按时间排序。日志基本上是一个队列,它可以由生产者附加在其末尾,订阅者可以通过维护指针自行处理消息。
- 发布的第一条记录的偏移量为 0,第二条记录的偏移量为 1,依此类推。
- 消费者通过访问偏移量指定的位置来消费数据。消费者定期将他们的位置保存在日志中。
- 这也使 Kafka 成为一个容错系统,因为如果当前消费者实例失败,其他消费者可以使用存储的偏移量来读取新记录。这种方法不需要磁盘寻道,因为数据以如下所示的顺序方式存在:
3、零拷贝原则:最常见的网络发送数据方式需要在Kernel模式和User模式之间进行多次上下文切换,这会导致内存带宽和CPU周期的消耗。零复制原则旨在通过请求内核将数据直接移动到响应套接字而不是通过应用程序移动它来减少这种情况。通过零拷贝原则的实现,Kafka 的速度得到了极大的提升。
4. 最佳数据结构:树与队列:在数据存储方面,树似乎是首选的数据结构。大多数现代数据库使用某种形式的树数据结构。例如。 MongoDB 使用 BTree。
- 另一方面,Kafka 不是数据库而是消息系统,因此与数据库相比,它经历了更多的读/写操作。
- 为此使用树可能会导致随机 I/O,最终导致磁盘寻道——这在性能方面是灾难性的。
因此,它使用队列,因为所有数据都附加在末尾,并且通过使用指针读取非常简单。这些操作是 O(1) 从而确认了 Kafka 队列数据结构的效率。
5. 横向扩展: Kafka 能够为单个主题设置多个分区,这些分区可以分布在数千台机器上。这使其能够保持高吞吐量并提供低延迟。
6. 数据的压缩和批处理: Kafka 将数据批处理成块,这有助于减少网络调用并将大部分随机写入转换为顺序写入。与压缩单个消息相比,压缩一批数据更有效。
因此,Kafka 压缩一批消息并将它们发送到服务器,在那里它们以压缩形式本身写入。当订阅者使用它们时,它们被解压缩。 Kafka 支持 GZIP 和 Snappy 压缩协议。