Apache Kafka 简明教程

Apache Kafka - WorkFlow

目前,我们已讨论了 Kafka 的核心概念。现在让我们重点介绍一下 Kafka 的工作流。

Kafka 仅仅是由一个或多个分区分割而成的主题集合。Kafka 分区是有序的消息序列,其中每条消息都由其索引(称为偏移量)标识。Kafka 集群中的所有数据都是分区的离散并集。传入消息被写入分区的末尾,消息被消费者依次读取。通过将消息复制到不同的代理来提供持久性。

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

Workflow of Pub-Sub Messaging

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

  1. 生产者定期向某个主题发送消息。

  2. Kafka 代理将所有消息存储在为该特定主题配置的分区中。它确保消息在分区中得到均衡共享。如果生产者发送两条消息,并且有两个分区,则 Kafka 会将一条消息存储在第一个分区中,第二条消息存储在第二个分区中。

  3. 消费者订阅特定主题。

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

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

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

  7. 消费者会接收到消息并对其进行处理。

  8. 一旦消息处理完毕,消费者就会向 Kafka 代理发送确认。

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

  10. 上述流程将重复执行,直到消费者停止请求。

  11. 消费者可以选择随时回退或跳至主题的所需偏移量,并读取所有后续消息。

Workflow of Queue Messaging / Consumer Group

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

  1. 生产者定期向某个主题发送消息。

  2. 与早先情景类似,Kafka 将所有消息存储在那特定主题配置的分区中。

  3. 单一使用者订阅特定主题,假设主题 ID 为“主题-01”,组 ID 为“组-1”。

  4. 在有新的使用者订阅同一主题(主题-01)并具有与组-1 相同的组 ID 之前,Kafka 与使用者的互动方式与 Pub-Sub Messaging 相同。

  5. 一旦新使用者出现,Kafka 会切换其操作模式为共享模式并共享这两位使用者之间的资料。此共享将一直持续到使用者数量达到为那特定主题配置的分区数量。

  6. 一旦使用者数量超出分区数量,新使用者不会收到任何进一步的消息,直到任何一位现有使用者退订。此情景会出现的原因是,Kafka 中的每位使用者都会被分配至少一个分区,一旦所有分区都分配给现有使用者,新使用者将不得不等待。

  7. 此功能也被称为“使用者群体”。依同样的方式,Kafka 将以非常简单且有效的方式提供上述两个系统最优秀的特点。

Role of ZooKeeper

Apache Kafka 的一个关键依赖是 Apache Zookeeper,这是一项分布式配置与同步服务。Zookeeper 是 Kafka 代理与使用者之间的协调界面。Kafka 服务器通过 Zookeeper 丛集共享资讯。Kafka 会在 Zookeeper 中存储基本元资料,例如关于主题、代理、使用者偏移(队列阅读器)等資訊。

由于所有关键资讯都被存储在 Zookeeper 中,而且它通常会跨其整体复制该资料,因此 Kafka 代理/Zookeeper 的故障不会影响 Kafka 丛集的状态。一旦 Zookeeper 重新启动,Kafka 将还原状态。这为 Kafka 带来了零停机时间。在领导者发生故障时,Kafka 代理之间的领导者选举也是通过使用 Zookeeper 进行的。

要深入了解 Zookeeper,请参阅 zookeeper

在下一章节中,让我们继续深入了解如何在您的机器上安装 Java、ZooKeeper 和 Kafka。