gpt4 book ai didi

apache-kafka - Apache Kafka 生产者代理连接

转载 作者:行者123 更新时间:2023-12-04 01:27:37 24 4
gpt4 key购买 nike

我有一组作为集群运行的 Kafka 代理实例。我有一个向 Kafka 生成数据的客户:

props.put("metadata.broker.list", "broker1:9092,broker2:9092,broker3:9092");

当我们使用 tcpdump 进行监控时,我可以看到只有到 broker1 和 broker2 的连接是建立的,而对于 broker3,我的生产者没有连接。我有一个只有一个分区的主题。

我的问题:
  • 代理数量和主题分区之间的关系如何?我是否应该始终拥有经纪人数量 = 分区数量?
  • 为什么在我的情况下,我无法连接到 broker3?或者至少我的网络监控没有显示我的 Producer 与 broker3 建立了连接?

  • 如果我能从 Producer 的角度更深入地了解与 Broker 的连接是如何工作的,那就太好了。

    最佳答案

    显然,您的生产者不需要连接到 broker3 :)

    我将尝试向您解释当您向 Kafka 生成数据时会发生什么:

  • 您启动了一些代理,假设为 3,然后创建一些主题 foo有 2 个分区,复制因子为 2。很简单的例子,但对某人来说可能是一个真实的例子。
  • 您使用 metadata.broker.list 创建了一个生产者(或 bootstrap.servers 在新生产者中)配置到这些代理。值得一提的是,您不必指定集群中的所有代理,实际上您可以只指定其中的 1 个,它仍然可以工作。我也会解释一下。
  • 您向主题 foo 发送消息使用您的生产商。
  • 生产者查找其本地元数据缓存以查看主题 foo 的每个分区的领导者是哪些代理。以及您的 foo 有多少个分区话题有。由于这是第一次发送给生产者,本地缓存不包含任何内容。
  • 生产者发送 TopicMetadataRequestmetadata.broker.list 中的每个经纪人顺序直到第一个成功响应。这就是为什么我提到该列表中的 1 个经纪人只要还活着就可以工作。
  • 已退回 TopicMetadataResponse将包含有关请求主题的信息,在您的情况下是 foo和集群中的代理。基本上,此响应包含以下内容:
  • 集群中的代理列表,其中每个代理都有一个 ID、主机和端口。此列表可能不包含集群中的整个代理列表,但应至少包含负责为主题主题提供服务的代理列表。
  • 主题元数据列表,其中每个条目都有主题名称、分区数、每个分区的领导代理 ID 和每个分区的 ISR 代理 ID。
  • 基于 TopicMetadataResponse您的生产者建立了它的本地缓存并且现在确切地知道对主题的请求 foo分区0应该去找经纪人 X。
  • 根据主题中的分区数量,生产者对您的消息进行分区,并在知道它应该作为批处理的一部分发送给某个代理的情况下对其进行累积。
  • 当批次已满或 linger.ms超时过后,您的生产者将批次刷新到代理。 “刷新”是指“打开与代理的新连接或重用现有连接,并发送 ProduceRequest”。

  • 生产者不需要打开与所有代理的不必要连接,因为您正在生产的主题可能不会由某些代理提供服务,并且您的集群可能非常大。想象一个有很多主题的 1000 个代理集群,但其中一个主题只有一个分区——您只需要一个连接,而不是 1000 个。

    在您的特定情况下,如果您只有一个分区,我不能 100% 确定为什么您有 2 个到代理的打开连接,但我假设在元数据发现期间打开了一个连接并被缓存以供重用,第二个是生成数据的实际代理连接。但是,在这种情况下,我可能是错的。

    但无论如何,根本不需要为第三个代理建立连接。

    关于您关于“我是否应该始终拥有经纪人数量 = 分区数量”的问题?答案很可能是否定的。如果你解释你想要实现的目标,也许我可以为你指明正确的方向,但这太宽泛而无法解释。我推荐阅读 this澄清事情。

    UPD 在评论中回答问题:

    元数据缓存在两种情况下更新:
  • 如果生产者因任何原因无法与代理通信 - 这包括代理根本无法访问以及代理响应错误(例如“我不再是该分区的领导者,请走开”)
  • 如果没有发生故障,客户端仍会每隔 metadata.max.age.ms 刷新一次元数据。 ( https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/CommonClientConfigs.java#L42-L43 ) 来发现新的代理和分区本身。
  • 关于apache-kafka - Apache Kafka 生产者代理连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38893915/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com