Kafka 工作流程
-
Kafka 工作流程
到目前为止,我们讨论了Kafka的核心概念。现在让我们来了解一下Kafka的工作流程。Kafka只是主题(Topic)的集合,分为一个或多个分区。Kafka分区是消息的线性顺序序列,其中每个消息均由其索引(称为偏移)标识。Kafka群集中的所有数据都是分区的脱节联合。传入消息写入分区的末尾,使用者依次读取消息。通过将消息复制到不同的代理来提供持久性。Kafka以快速,可靠,持久,容错和零停机的方式提供基于发布-订阅和基于队列的消息传递系统。在这两种情况下,生产者只需将消息发送到某个主题,消费者就可以根据自己的需要选择任何一种消息传递系统。让我们按照下一部分中的步骤来了解消费者如何选择自己选择的消息传递系统。 -
发布-订阅消息的工作流程
以下是发布-订阅消息的分步工作流程-- 生产者定期向主题发送消息。
- Kafka代理将所有消息存储在为特定主题配置的分区中。它确保消息在分区之间平均共享。如果生产者发送了两个消息,并且有两个分区,Kafka将在第一个分区中存储一个消息,在第二个分区中存储第二个消息。
- 消费者订阅特定主题。
- 消费者订阅主题后,Kafka将向消费者提供该主题的当前偏移量,并将偏移量保存在Zookeeper集合中。
- 消费者将定期(例如100 ms)向Kafka请求新消息。
- 一旦Kafka从生产者那里收到消息,它将把这些消息转发给消费者。
- 消费者将收到消息并进行处理。
- 消息处理后,消费者将向Kafka代理发送确认。
- 一旦Kafka收到确认,它将偏移量更改为新值并在Zookeeper中对其进行更新。由于在Zookeeper中保留了偏移量,因此即使在服务器出现故障时,使用者也可以正确读取下一条消息。
- 以上流程将重复进行,直到消费者停止请求为止。
- 消费者可以选择随时倒退/跳至所需的主题偏移量并阅读所有后续消息。
-
队列消息/使用者组的工作流程
在队列消息传递系统而不是单个使用者中,具有相同组ID的一组使用者将订阅一个主题。简而言之,订阅具有相同组ID的主题的消费者被视为一个组,并且在它们之间共享消息。让我们检查该系统的实际工作流程。- 生产者(Producer)定期发送消息到主题(Topic)。
- Kafka将所有消息存储在为特定主题配置的分区中,类似于之前的场景。
- 单个消费者(Consumers)订阅特定的主题(Topic),假设Topic-01的组ID为Group-1。
- Kafka以与发布者-订阅消息传递相同的方式与消费者交互,直到新的消费者订阅相同的主题Topic-01并具有与Group-1相同的组ID。
- 新用户到达后,Kafka将其操作切换为共享模式,并在两个用户之间共享数据。这种共享将一直持续到消费者数量达到为该特定主题配置的分区数量为止。
- 一旦使用者数量超过分区数量,新的使用者就不会再收到任何消息,直到任何一个现有的使用者取消订阅为止。之所以出现这种情况,是因为将向Kafka中的每个使用者分配至少一个分区,并且一旦将所有分区分配给现有使用者,新的使用者就必须等待。
- 此功能也称为“消费者组”。同样,Kafka将以非常简单和有效的方式提供这两种系统中的最佳功能。
-
ZooKeeper的作用
Apache Kafka的关键依赖项是Apache Zookeeper,它是一种分布式配置和同步服务。Zookeeper充当Kafka代理和消费者之间的协调者。Kafka服务器通过Zookeeper群集共享信息。Kafka将基本元数据存储在Zookeeper中,例如有关主题,代理,消费者补偿(队列读取器)的信息等。 由于所有关键信息都存储在Zookeeper中,并且通常会在其整个集合中复制此数据,因此Kafka代理/ Zookeeper的故障不会影响Kafka集群的状态。Zookeeper重新启动后,Kafka将恢复状态。这使Kafka的停机时间为零。如果代理Leader故障,Kafka代理之间的Leader选举也可以通过Zookeeper进行。要了解有关Zookeeper的更多信息,请参阅zookeeper教程在下一章中,让我们继续如何在您的计算机上安装Java,ZooKeeper和Kafka。