截至目前,我们已经了解了Kafka的核心概念。 现在让我们来看看Kafka的工作流程。
Kafka只是分成一个或多个分区的主题集合。 Kafka分区是消息的线性排序序列,每个消息由其索引标识(称为偏移量)。 Kafka集群中的所有数据都是不相关的分区联合。 传入消息写在分区的末尾,消费者依次读取消息。 通过将消息复制到不同的经纪人来提供持久性。
Kafka以快速,可靠,持久的容错和零停机方式提供基于发布订阅和队列的消息传递系统。 在这两种情况下,生产者只需将消息发送到一个主题,消费者就可以根据他们的需要选择任何一种消息传递系统。 可通过下一节中的步骤来了解消费者如何选择它们的消息系统。
发布订阅消息传递的工作流
以下是发布订阅消息工作流程的步骤 –
- 生产者定期向主题发送消息。
- Kafka经纪人将所有消息存储在为该特定主题配置的分区中。 它确保消息在分区之间平均分享。 如果制作者发送两条消息并且有两个分区,则Kafka将在第一个分区中存储一条消息,并在第二个分区中存储第二条消息。
- 消费者订阅特定主题。
- 当消费者订阅了一个主题,Kafka将向消费者提供该主题的当前偏移量,并且还将该偏移量保存在Zookeeper集合中。
- 消费者会定期请求Kafka(如100小时)收取新消息。
- Kafka收到生产者的消息后,会将这些消息转发给消费者。
- 消费者将收到消息并进行处理。
- 当消息被处理,消费者将向Kafka经纪人发送确认。
- Kafka收到确认后,会将偏移量更改为新值并在Zookeeper中更新它。 由于在Zookeeper中维护了偏移量,因此即使在服务器繁忙期间,使用者也可以正确读取下一条消息。
- 上述流程将重复,直到消费者停止请求。
- 消费者可以随时选择倒带/跳至期望的主题偏移量并阅读所有后续消息。
队列消息/消费者组的工作流
在队列消息系统(不是单个消费者)中,具有相同组ID的一组消费者将订阅主题。 简而言之,订阅具有相同组ID的主题的消费者被视为单个组,并且消息在他们之间共享。 让我们来看看一下这个系统的实际工作流程。
- 生产者定期向主题发送消息。
- Kafka将所有消息存储在为特定主题配置的分区中,类似于之前的场景。
- 单个消费者订阅特定主题,将Group ID设为Group-1。
- Kafka发布订阅消息与消费者进行交互,直到新消费者订阅同一主题Topic-01,其Group 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经纪人之间的领导者选举也是通过在领导者失败的情况下,使用Zookeeper来完成的。
要了解Zookeeper的更多信息,请参阅zookeeper教程。
让我们继续,在下一章中学习如何安装Java,ZooKeeper和Kafka。