为什么消费者连接到zookeeper来检索分区位置?而且kafka 生产环境 者必须连接到其中一个代理来检索元数据 .
我的观点是,当每个经纪人已经拥有所有必要的元数据来告诉 生产环境 者发送他们的消息的位置时,使用zookeeper究竟是什么?经纪人难道不能向消费者发送同样的信息吗?
我可以理解为什么代理拥有元数据,每次向它们发送新消息时都不必与zookeeper Build 连接 . 动物园管理员有没有我失踪的功能?我发现很难想到为什么在kafka集群中确实需要zookeeper的原因 .
3 回答
首先,只有高级消费者才需要zookeeper .
SimpleConsumer
不需要zookeeper工作 .高级别消费者需要zookeeper的主要原因是跟踪消耗的偏移并处理负载 balancer .
现在更详细 .
关于偏移量跟踪,请考虑以下情况:启动消费者,消耗100条消息并关闭消费者 . 下次启动您的消费者时,您可以使用zookeeper启动它:它为每个组/主题/分区存储偏移量 . 所以这种方式下次启动你的消费者时可能会问"hey zookeeper, what's the offset I should start consuming from?" . Kafka实际上不仅可以在zookeeper中存储偏移量,而且还可以在其他存储中存储偏移量(现在只有
zookeeper
和kafka
偏移存储可用,我不确定kafka
存储是否已完全实现) .关于负载 balancer ,产生的消息量可能非常大,可由1台机器处理,您可能希望在某个时刻增加计算能力 . 假设您有一个包含100个分区的主题,并且要处理这10个计算机的消息 . 实际上有几个问题出现在这里:
这10台机器应该如何划分彼此之间的分区?
如果其中一台机器死了怎么办?
如果要添加其他机器会怎样?
再一次,这里是zookeeper开始的地方:它跟踪组中的所有消费者,并且每个高级消费者都订阅了该组中的更改 . 关键是当消费者出现或消失时,zookeeper会通知所有消费者并触发重新 balancer ,以便他们将分区近似平分(例如 balancer 负载) . 这样,它可以保证如果其中一个消费者死亡,其他人将继续处理该消费者拥有的分区 .
使用kafka 0.9,引入了新的Consumer API . 新的消费者不需要连接到Zookeeper,因为组 balancer 是由kafka本身提供的 .
你是对的,自kafka 0.9 release以来,消费者不需要连接到ZooKeeper . 他们重新设计了api并引入了新的消费者客户端:
和