Apache Kafka 工作流程



目前,我们已经讨论了 Kafka 的核心概念。现在让我们来了解一下 Kafka 的工作流程。

Kafka 简单来说就是一系列主题,这些主题被分成一个或多个分区。Kafka 分区是一个线性排序的消息序列,其中每条消息都由其索引(称为偏移量)标识。Kafka 集群中的所有数据都是分区的互斥并集。传入的消息写入分区的末尾,消息由消费者顺序读取。通过将消息复制到不同的代理来提供持久性。

Kafka 以快速、可靠、持久、容错和零停机的方式提供发布-订阅和基于队列的消息系统。在这两种情况下,生产者只需将消息发送到主题,消费者就可以根据需要选择任何一种消息系统。让我们按照下一节中的步骤来了解消费者如何选择他们所需的消息系统。

发布-订阅消息的工作流程

以下是发布-订阅消息的步骤式工作流程:

  • 生产者定期向主题发送消息。

  • Kafka 代理将所有消息存储在为该特定主题配置的分区中。它确保消息在分区之间平均分配。如果生产者发送两条消息,并且有两个分区,Kafka 将一条消息存储在第一个分区中,另一条消息存储在第二个分区中。

  • 消费者订阅特定主题。

  • 一旦消费者订阅了主题,Kafka 将向消费者提供该主题的当前偏移量,并将偏移量保存在 ZooKeeper 集群中。

  • 消费者将定期(例如 100 毫秒)向 Kafka 请求新消息。

  • 一旦 Kafka 从生产者接收消息,它就会将这些消息转发给消费者。

  • 消费者将接收消息并处理它。

  • 消息处理完毕后,消费者将向 Kafka 代理发送确认。

  • Kafka 接收到确认后,它会将偏移量更改为新值并在 ZooKeeper 中更新它。由于偏移量保存在 ZooKeeper 中,即使服务器发生故障,消费者也可以正确读取下一条消息。

  • 上述流程将重复,直到消费者停止请求。

  • 消费者可以选择随时回退/跳到主题的所需偏移量并读取所有后续消息。

队列消息/消费者组的工作流程

在队列消息系统中,不是单个消费者,而是具有相同“组 ID”的一组消费者将订阅主题。简单来说,使用相同“组 ID”订阅主题的消费者被视为单个组,消息在它们之间共享。让我们检查一下这个系统的实际工作流程。

  • 生产者定期向主题发送消息。

  • Kafka 将所有消息存储在为该特定主题配置的分区中,类似于之前的场景。

  • 单个消费者订阅特定主题,假设为“Topic-01”,其“组 ID”为“Group-1”。

  • 直到新的消费者使用相同的“组 ID” “Group-1”订阅相同的主题“Topic-01”,Kafka 的交互方式与发布-订阅消息相同。

  • 一旦新的消费者加入,Kafka 将切换到共享模式并在两个消费者之间共享数据。这种共享将持续到消费者的数量达到为该特定主题配置的分区数量。

  • 一旦消费者的数量超过分区的数量,新的消费者将不会收到任何进一步的消息,直到任何一个现有消费者取消订阅。出现这种情况是因为 Kafka 中的每个消费者将至少分配一个分区,一旦所有分区都分配给现有消费者,新的消费者就必须等待。

  • 此功能也称为“消费者组”。同样,Kafka 将以非常简单有效的方式提供这两个系统的最佳功能。

ZooKeeper 的作用

Apache Kafka 的一个关键依赖项是 Apache ZooKeeper,它是一个分布式配置和同步服务。ZooKeeper 充当 Kafka 代理和消费者之间的协调接口。Kafka 服务器通过 ZooKeeper 集群共享信息。Kafka 在 ZooKeeper 中存储基本元数据,例如有关主题、代理、消费者偏移量(队列读取器)等信息。

由于所有关键信息都存储在 ZooKeeper 中,并且它通常在其集群中复制此数据,因此 Kafka 代理/ZooKeeper 的故障不会影响 Kafka 集群的状态。Kafka 将在 ZooKeeper 重新启动后恢复状态。这为 Kafka 提供了零停机时间。Kafka 代理之间的领导者选举也是在领导者故障时使用 ZooKeeper 完成的。

要了解更多关于 ZooKeeper 的信息,请参考 zookeeper

让我们在下一章继续学习如何在你的机器上安装 Java、ZooKeeper 和 Kafka。

广告