为什么Kafka消费者连接到zookeeper,生产者从经纪人那里获取元数据?

时间:2015-01-13 08:49:40

标签: apache-zookeeper apache-kafka

为什么消费者连接到zookeeper来检索分区位置?而且kafka生产者必须连接到其中一个代理来检索元数据。

我的观点是,当每个经纪人已经拥有所有必要的元数据来告诉生产者发送邮件的位置时,使用zookeeper究竟是什么?经纪人难道不能向消费者发送同样的信息吗?

我可以理解为什么代理拥有元数据,每次向它们发送新消息时都不必与zookeeper建立连接。动物园管理员有没有我失踪的功能?我发现很难想到为什么在kafka集群中真正需要zookeeper的原因。

3 个答案:

答案 0 :(得分:47)

首先,只有高级消费者才需要zookeeper。 SimpleConsumer不需要zookeeper工作。

高级别消费者需要zookeeper的主要原因是跟踪消耗的偏移并处理负载平衡。

现在更详细。

关于偏移量跟踪,请设想以下方案:启动消费者,消耗100条消息并关闭消费者。下次启动消费者时,您可能希望从上次消耗的偏移量(即100)恢复,这意味着您必须在某处存储最大消耗偏移量。在这里,zookeeper开始使用:它存储每个组/主题/分区的偏移量。所以这种方式下次你开始你的消费者时,它可能会问,#动物园管理员,我应该开始消费的偏差是什么?"。 Kafka实际上不仅可以在zookeeper中存储偏移量,而且还可以在其他存储中存储偏移量(现在只有zookeeperkafka偏移存储可用,而且我不确定{{ 1}}存储已完全实现。)

关于负载平衡,生成的消息量可能非常大,需要由1台计算机处理,您可能希望在某个时刻增加计算能力。假设您有一个包含100个分区的主题,并且要处理这10个计算机的消息。实际上有几个问题出现在这里:

  • 这10台机器应该如何划分彼此之间的分区?
  • 如果其中一台机器死了会怎么样?
  • 如果要添加其他计算机会怎样?

再次,动物园管理员在这里开始:它跟踪群组中的所有消费者,并且每个高级消费者都订阅了该群组中的变化。关键是当消费者出现或消失时,zookeeper通知所有消费者并触发重新平衡,以便他们将分区近似平分(例如平衡负载)。这样,它可以保证如果其中一个消费者死亡,其他人将继续处理该消费者拥有的分区。

答案 1 :(得分:11)

使用kafka 0.9+引入了新的Consumer API。新的消费者不需要连接到Zookeeper,因为组平衡由kafka本身提供。

答案 2 :(得分:0)

是的,自kafka 0.9 release起,消费者不需要连接到ZooKeeper。他们重新设计了api,并引入了新的消费者客户端:

  

0.9版本引入了对新设计的beta支持   消费者客户。总体而言,新产品的主要区别   消费者是它消除了“高级”之间的区别   基于ZooKeeper的使用者和“低级” SimpleConsumer API,以及   而是提供了统一的使用者API。

  

最后,这完成了过去几年中完成的一系列项目   使Kafka客户与Zookeeper完全脱钩,从而完全消除   消费者客户对ZooKeeper的依赖性。

相关问题