Apache Kafka - 工作流程


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

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

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

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

以下是发布-订阅消息传递的逐步工作流程 -

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

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

  • 消费者订阅特定主题。

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Kafka 以与 Pub-Sub 消息传递相同的方式与消费者进行交互,直到新消费者订阅相同的主题Topic-01,其组 IDGroup-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。