到目前为止,我们讨论了kafka的核心概念。 让我们现在来看一下kafka的工作流程。
kafka只是分为一个或多个分区的主题的集合。 kafka分区是消息的线性有序序列,其中每个消息由它们的索引(称为偏移)来标识。 kafka集群中的所有数据都是不相连的分区联合。 传入消息写在分区的末尾,消息由消费者顺序读取。 通过将消息复制到不同的代理提供持久性。
kafka以快速,可靠,持久,容错和零停机的方式提供基于pub-sub和队列的消息系统。 在这两种情况下,生产者只需将消息发送到主题,消费者可以根据自己的需要选择任何一种类型的消息传递系统。 让我们按照下一节中的步骤来了解消费者如何选择他们选择的消息系统。
以下是pub-sub消息的逐步工作流程 -
生产者定期向主题发送消息。
kafka代理存储为该特定主题配置的分区中的所有消息。 它确保消息在分区之间平等共享。 如果生产者发送两个消息并且有两个分区,kafka将在第一分区中存储一个消息,在第二分区中存储第二消息。
消费者订阅特定主题。
一旦消费者订阅主题,kafka将向消费者提供主题的当前偏移,并且还将偏移保存在zookeeper系综中。
消费者将定期请求kafka(如100 ms)新消息。
一旦kafka收到来自生产者的消息,它将这些消息转发给消费者。
消费者将收到消息并进行处理。
一旦消息被处理,消费者将向kafka代理发送确认。
一旦kafka收到确认,它将偏移更改为新值,并在zookeeper中更新它。 由于偏移在zookeeper中维护,消费者可以正确地读取下一封邮件,即使在服务器暴力期间。
以上流程将重复,直到消费者停止请求。
消费者可以随时回退/跳到所需的主题偏移量,并阅读所有后续消息。
在队列消息传递系统而不是单个消费者中,具有相同组id
的一组消费者将订阅主题。 简单来说,订阅具有相同 group id
的主题的消费者被认为是单个组,并且消息在它们之间共享。 让我们检查这个系统的实际工作流程。
生产者以固定间隔向某个主题发送消息。
kafka存储在为该特定主题配置的分区中的所有消息,类似于前面的方案。
单个消费者订阅特定主题,假设 topic-01
为 group id
为 group-1
。
kafka以与发布 - 订阅消息相同的方式与消费者交互,直到新消费者以相同的组id
订阅相同主题 topic-01
1 。
一旦新消费者到达,kafka将其操作切换到共享模式,并在两个消费者之间共享数据。 此共享将继续,直到用户数达到为该特定主题配置的分区数。
一旦消费者的数量超过分区的数量,新消费者将不会接收任何进一步的消息,直到现有消费者取消订阅任何一个消费者。 出现这种情况是因为kafka中的每个消费者将被分配至少一个分区,并且一旦所有分区被分配给现有消费者,新消费者将必须等待。
此功能也称为使用者组
。 同样,kafka将以非常简单和高效的方式提供两个系统中最好的。
apache kafka的一个关键依赖是apache zookeeper,它是一个分布式配置和同步服务。 zookeeper是kafka代理和消费者之间的协调接口。 kafka服务器通过zookeeper集群共享信息。 kafka在zookeeper中存储基本元数据,例如关于主题,代理,消费者偏移(队列读取器)等的信息。
由于所有关键信息存储在zookeeper中,并且它通常在其整体上复制此数据,因此kafka代理/ zookeeper的故障不会影响kafka集群的状态。 kafka将恢复状态,一旦zookeeper重新启动。 这为kafka带来了零停机时间。 kafka代理之间的领导者选举也通过使用zookeeper在领导者失败的情况下完成。
要了解有关zookeeper的详细信息,请参阅 zookeeper
让我们继续进一步关于如何在您的机器上安装java,zookeeper和kafka在下一章。