学习kafka的第四天

121 阅读4分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战 让我们创建一个使用 Java 客户端发布和使用消息的应用程序。Kafka 生产者客户端由以下 API 组成。

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

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

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

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

  • 生产者定期向主题发送消息。
  • Kafka 代理将所有消息存储在为该特定主题配置的分区中。它确保消息在分区之间平等共享。如果生产者发送两条消息并且有两个分区,则Kafka将在第一个分区中存储一条消息,在第二个分区中存储第二条消息。
  • 消费者订阅特定主题。
  • 一旦消费者订阅了一个主题,Kafka 将向消费者提供该主题的当前偏移量,并将该偏移量保存在 Zookeeper 集合中。
  • 消费者将定期(如 100 毫秒)向 Kafka 请求新消息。
  • 一旦 Kafka 收到来自生产者的消息,它就会将这些消息转发给消费者。
  • 消费者将收到消息并对其进行处理。
  • 处理完消息后,消费者将向 Kafka 代理发送确认。
  • 一旦 Kafka 收到确认,它会将偏移量更改为新值并在 Zookeeper 中更新它。由于在 Zookeeper 中维护了偏移量,因此即使在服务器异常期间,消费者也可以正确读取下一条消息。
  • 上述流程将重复,直到消费者停止请求。
  • 消费者可以选择随时回退/跳到主题的所需偏移量并阅读所有后续消息。

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

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

  • 生产者定期向主题发送消息。
  • Kafka 将所有消息存储在为该特定主题配置的分区中,类似于之前的场景。
  • 单个消费者订阅特定主题,假设"Topic-01"和"Group ID"为"Group-1"。
  • Kafka 以与 Pub-Sub 消息传递相同的方式与消费者交互,直到新消费者订阅相同的主题"Topic-01",其"组 ID"与"Group-1 相同"。
  • 一旦新的消费者到达,Kafka 将其操作切换到共享模式并在两个消费者之间共享数据。这种共享将一直持续到消费者数量达到为该特定主题配置的分区数量。
  • 一旦消费者数量超过分区数量,新消费者将不会收到任何进一步的消息,直到现有消费者中的任何一个退订。出现这种情况是因为 Kafka 中的每个消费者至少会分配一个分区,一旦所有分区都分配给现有消费者,新消费者将不得不等待。
  • 此功能也称为"消费者组"。同样,Kafka 将以非常简单和高效的方式提供两个系统中最好的。

ZooKeeper 的作用

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

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