为什么kafka的消费者连接到zookeeper,而生产者从代理那里获得元数据?

qvtsj1bj  于 2021-06-08  发布在  Kafka
关注(0)|答案(3)|浏览(536)

为什么使用者连接到zookeeper来检索分区位置?Kafka制作者必须连接到其中一个代理来检索元数据。
我的观点是,当每个代理已经拥有所有必要的元数据来告诉生产者发送消息的位置时,zookeeper到底有什么用?经纪人不能把同样的信息发给消费者吗?
我可以理解为什么代理拥有元数据,而不必在每次向其发送新消息时都与zookeeper建立连接。zookeeper有什么功能我没有?我发现很难找到一个原因,为什么在Kafka集群中真的需要zookeeper。

3ks5zfa0

3ks5zfa01#

首先,zookeeper只适用于高级消费者。 SimpleConsumer 不需要Zookeeper工作。
高级使用者需要zookeeper的主要原因是跟踪消耗的偏移量和处理负载平衡。
现在更详细。
关于偏移量跟踪,想象一下下面的场景:您启动一个消费者,消费100条消息,然后关闭消费者。下次启动消费者时,您可能希望从上次消耗的偏移量(即100)恢复,这意味着您必须将最大消耗的偏移量存储在某个位置。zookeeper的作用是:它存储每个组/主题/分区的偏移量。所以,这样下次你开始消费的时候,它可能会问“嘿,Zookeeper,我应该从哪开始消费?”。Kafka实际上正在朝着不仅能在zookeeper中存储偏移量,还能在其他存储中存储偏移量的方向发展(目前仅此而已) zookeeper 以及 kafka 偏移存储是可用的,我不确定 kafka 完全实现了存储)。
关于负载平衡,产生的消息量可能非常大,需要一台机器来处理,您可能希望在某个时候增加计算能力。假设您有一个有100个分区的主题,要处理这么多的消息,您有10台机器。实际上,这里出现了几个问题:
这10台机器应该如何划分分区?
如果其中一台机器死了怎么办?
如果要添加另一台机器,会发生什么情况?
再说一次,这里是zookeeper发挥作用的地方:它跟踪组中的所有消费者,每个高级消费者都订阅了组中的更改。关键是当使用者出现或消失时,zookeeper会通知所有使用者并触发重新平衡,以便它们几乎相等地分割分区(例如,平衡负载)。通过这种方式,它可以保证如果一个使用者死亡,其他使用者将继续处理该使用者拥有的分区。

krcsximq

krcsximq2#

kafka0.9+引入了新的消费api。新的消费者不需要连接到zookeeper,因为组平衡是由kafka自己提供的。

lqfhib0f

lqfhib0f3#

你说得对,自从kafka 0.9发布以来,用户不需要连接zookeeper。他们重新设计了api,并引入了新的客户机:
0.9版本为新重新设计的客户机引入了beta版支持。在较高的层次上,新使用者的主要区别在于它消除了基于zookeeper的“高级”使用者和“低级”simpleconsumerapi之间的区别,而是提供了一个统一的使用者api。

最后,这完成了过去几年中完成的一系列项目,将kafka客户机与zookeeper完全解耦,从而完全消除了客户机对zookeeper的依赖。

相关问题