首页 文章

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

提问于
浏览
29

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

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

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

3 回答

  • 45

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

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

    现在更详细 .

    关于偏移量跟踪,请考虑以下情况:启动消费者,消耗100条消息并关闭消费者 . 下次启动您的消费者时,您可以使用zookeeper启动它:它为每个组/主题/分区存储偏移量 . 所以这种方式下次启动你的消费者时可能会问"hey zookeeper, what's the offset I should start consuming from?" . Kafka实际上不仅可以在zookeeper中存储偏移量,而且还可以在其他存储中存储偏移量(现在只有 zookeeperkafka 偏移存储可用,我不确定 kafka 存储是否已完全实现) .

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

    • 这10台机器应该如何划分彼此之间的分区?

    • 如果其中一台机器死了怎么办?

    • 如果要添加其他机器会怎样?

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

  • 10

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

  • 0

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

    0.9版本为新重新设计的消费者客户端引入了beta支持 . 从较高层面来看,新消费者的主要区别在于它消除了“高级”基于ZooKeeper的消费者与“低级”SimpleConsumer API之间的区别,而是提供了统一的消费者API .

    最后,这完成了在过去几年中完成的一系列项目,以完全将Kafka客户端与Zookeeper分离,从而完全消除了消费者客户端对ZooKeeper的依赖 .

相关问题