Apache Kafka - 工作流

到目前为止,我们讨论了 Kafka 的核心概念。 现在让我们对 Kafka 的工作流程有所了解。

Kafka 只是一组主题的集合,分为一个或多个分区。 Kafka 分区是一个线性排序的消息序列,其中每条消息都由它们的索引(称为偏移量)标识。 Kafka 集群中的所有数据都是不相交的分区联合。 传入消息写入分区末尾,消息由消费者顺序读取。 持久性是通过将消息复制到不同的代理来提供的。

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


Pub-Sub 消息传递的工作流程

以下是 Pub-Sub 消息传递的逐步工作流程 −

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

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

  • 消费者订阅特定主题。

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

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

  • 一旦 Kafka 收到来自生产者的消息,它就会将这些消息转发给消费者。

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

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

  • 一旦 Kafka 收到确认,它将偏移量更改为新值并在 Zookeeper 中更新它。 由于在 Zookeeper 中维护了偏移量,因此即使在服务器异常时,消费者也可以正确读取下一条消息。

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

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


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

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

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

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

  • 单个消费者订阅特定主题,假设 Topic-01Group IDGroup-1

  • Kafka 以与 Pub-Sub 消息传递相同的方式与消费者交互,直到新的消费者订阅相同的主题,Topic-01 具有与 Group- 相同的 Group ID 1

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

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

  • 此功能也称为消费者组。 同样,Kafka 将以非常简单和高效的方式提供两个系统中最好的部分。


ZooKeeper 的角色

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

由于所有关键信息都存储在 Zookeeper 中,并且它通常会在其整体中复制这些数据,因此 Kafka 代理/Zookeeper 的故障不会影响 Kafka 集群的状态。 一旦 Zookeeper 重新启动,Kafka 将恢复状态。 这使 Kafka 的停机时间为零。 Kafka broker 之间的领导选举也是在领导失败的情况下使用 Zookeeper 完成的。

要了解更多关于 Zookeeper 的信息,请参考 zookeeper 教程

让我们在下一章继续介绍如何在您的机器上安装 Java、ZooKeeper 和 Kafka。