java - ZooKeeper在集群中的作用?

标签 java apache-kafka apache-zookeeper

如果我有集群托管 1 个具有三个分区的主题。所以 ZooKeeper(ZK) 集群托管 3 个代理实例。

根据我的理解,

  1. Producer 将与 ZooKeeper 交互以在 broker 上发布消息。
  2. ZK 将根据每个代理实例的负载在内部决定它需要哪个分区来发布消息。 Broker也会和ZK进行交互 维护每个消费者实例的偏移量
  3. 同样,Consumer 将与 ZooKeeper 交互以使用来自 broker 的消息。 ZK 将根据负载从正确的代理中获取消息。

但是在阅读了Queue Messaging/Consumer Group 的工作流程 部分的粗体文本后,我感到很困惑 在kafka tutorial .我上面的理解错了吗?基于下面看起来生产者/消费者不直接与 zookeeper 交互。是不是在别的地方 ZK 与生产者/消费者交互的地方。如果是,谁(Zookeeper 或代理)需要发布或消费哪个代理实例消息?

ZooKeeper service is mainly used to notify producer and consumer about the presence of any new broker in the Kafka system or failure of the broker in the Kafka system. As per the notification received by the Zookeeper regarding presence or failure of the broker then producer and consumer takes decision and starts coordinating their task with some other broker. Basically Apache Zookeeper s a distributed configuration and synchronization service

最佳答案

您似乎很困惑,因为您认为由 Kafka 经纪人完成的大部分事情实际上是由客户完成的,而您认为由 Zookeeper 完成的大部分事情实际上是由经纪人完成的。

Kafka 是一个可扩展性很强的系统,因为客户端会进行大量处理。客户端未完成的部分由代理(以及称为 Controller 和协调器的特殊代理组件)完成。除了存储状态和代理的一些配置(以非常可靠的方式)之外,Zookeeper 做的很少

解决你的观点:

1) 不正确。新的 Producer 不直接与 ZooKeeper 交互。 Producer 直接与 broker 对话以发布消息或发出元数据请求以查找哪个 broker 是它要发布到的分区的领导者。

2) 不正确。 ZK 不“决定”任何事情。 ZK 是一个复制的容错存储系统,代理使用它来保存集群的信息和状态。发布到哪个分区的决定在生产者中完成,取决于发布消息的 key 和客户端分区程序算法。分区不是根据负载分配的,它们是根据键分配的(或者如果键为空)然后使用循环算法。 Broker 不会与 ZK 交互来维护每个消费者实例的偏移量。消费者跟踪他们自己的偏移量并将它们存储(有时,通过偏移量提交)在代理的 _consumer_offsets 主题中。

3) 不正确。 New Consumer 不会直接与 ZooKeeper 交互来消费来自 broker 的消息。 ZK 不会根据负载从正确的代理中获取消息。消费者将直接与经纪人对话,通过使用 kafka 协议(protocol)发送给经纪人的 RPC 加入和离开消费者组。

关于java - ZooKeeper在集群中的作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44702887/

相关文章:

c# - C# 和 Java 之间始终相等的简单哈希

java - 将数据从二维数组存储到数组

apache-zookeeper - 重新连接后 Apache Curator 丢失所有监视

apache-kafka - 在 kafka 中获取当前配置

apache-kafka - 动物园管理员 vs 卡夫卡筏

java - 在 Spring Batch 监听器中处理异常的正确方法是什么?

java - 无法远程启动 WebLogic 进行调试

java - Samza/Kafka 更新元数据失败

apache-kafka - MQTT 代理和 Apache Kafka 有什么区别

java - 如何在java中使用sasl机制PLAIN和安全协议(protocol)SASL_SSL配置kafka消费者?