Apache kafka 为什么kafka producer在初始化时使用代理端点而不是zk

Apache kafka 为什么kafka producer在初始化时使用代理端点而不是zk,apache-kafka,Apache Kafka,如果我有多个代理,我的制作人应该使用哪个代理?我是否需要手动切换代理以平衡负载?还有,为什么消费者只需要zookeeper端点而不需要代理端点 教程中的快速示例: > bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test > bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginnin

如果我有多个代理,我的制作人应该使用哪个代理?我是否需要手动切换代理以平衡负载?还有,为什么消费者只需要zookeeper端点而不需要代理端点

教程中的快速示例:

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test 
> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
我的制作人应该使用哪种经纪人
我是否需要手动切换代理以平衡负载

Kafka在集群上运行,这意味着一组节点,因此,在生成任何您需要告诉他您为应用程序配置的代理的
列表
的信息时,下面是从它们的文档中提取的一个小注释

“metadata.broker.list”定义生产者可以在哪里找到一个或多个代理,以确定每个主题的领导者。这不需要是集群中的完整代理集,但应至少包括两个,以防第一个代理不可用。不必担心找出哪个代理是主题(和分区)的领导者,生产者知道如何连接到代理并请求元数据,然后连接到正确的代理

希望这能消除你的一些困惑

还有,为什么消费者只需要zookeeper端点而不需要 代理端点

这在技术上是不正确的,因为有两种类型的API可用,高级和低级消费者

高级使用者基本上负责大多数事情,如领导者检测、线程问题等,但不提供对消息的太多控制,这正是使用其他替代方案的目的,简单或低级使用者,在这些替代方案中,您将看到您需要提供代理、分区相关的详细信息


因此,消费者仅在使用高级API时才需要zookeeper端点,如果使用Simple,则确实需要提供其他信息

Kafka将单个代理设置为每个主题的每个分区的负责人。领导者负责处理对该分区的读写操作。您不能决定从非领导者代理读取或写入

那么,向卡夫卡控制台制作人提供经纪人或经纪人列表意味着什么?嗯,您在命令行上提供的一个或多个代理只是您的制作人的第一个联系点。如果您列出的代理不是您需要的主题/分区的负责人,您的制作人将获得当前的负责人信息(在kafka speak中称为“主题元数据”),并在发送写操作之前根据需要重新连接到其他代理。事实上,如果您的主题有多个分区,它甚至可能并行连接到多个代理(如果分区的前导是不同的代理)


第二个问题:为什么消费者需要一个zookeeper列表来连接,而不是一个代理列表?答案是卡夫卡消费者可以在“团体”中操作,zookeeper用于协调这些团体(团体如何工作是一个更大的问题,超出了本Q的范围)。Zookeeper还存储主题的代理列表,因此消费者可以直接从Zookeeper中提取代理列表,这使得额外的--broker列表有点多余。

Kafka Producer API不直接与Zookeeper交互。但是,高级使用者API连接到Zookeeper以获取/更新每个使用者的分区偏移量信息。因此,如果消费者API无法连接到Zookeeper,它将失败。

以上所有答案在卡夫卡的旧版本中都是正确的,但随着卡夫卡0.9的到来,情况发生了变化


现在,无论是制作人还是消费者都不再与zookeeper直接互动。另一件有趣的事情是,在0.9中,Kafka消除了高级API和低级API之间的差异,因为两者都遵循统一的消费者API。

回答得好。关于您可能希望更新的第二个问题的一些澄清:高级消费者API直接使用ZK,主要是因为它将自己的数据写入ZK-it,我相信还有其他事情。在与静态代理列表连接后,是一个简单的消费者。从0.9开始,是kafka,它将存储最后的偏移量,而不是ZK,但是为什么制作人不能从zookeeper中也提取代理列表?