【问题标题】:Does kafka broker always check if its the leader while responding to read/write requestkafka 代理是否总是在响应读/写请求时检查它是否是领导者
【发布时间】:2020-12-06 15:33:58
【问题描述】:

我在生产者上看到 org.apache.kafka.common.errors.NotLeaderForPartitionException,据我了解,当生产者尝试向不是分区领导者的代理生成消息时,就会发生这种情况。 这是否意味着每次领导者完成写入请求时,它首先检查它是否是领导者? 如果是,这是否会转化为每个写入请求的 zookeeper 请求,以了解节点是否是领导者?

【问题讨论】:

    标签: apache-kafka broker leader


    【解决方案1】:

    生产者如何获取关于经纪人的元数据
    生产者向您在配置生产者时提供的代理之一发送包含主题列表的元请求。

    来自代理的响应包含这些主题中的分区列表以及每个分区的领导者。生产者缓存了这些信息,因此它知道将消息重定向到哪里。

    生产者何时刷新元数据
    我认为这取决于您使用的 kafka 客户端。ruby、java 或其他 kafka 客户端之间存在一些小差异。例如,在 java 中:

    1. 生产者会在客户端初始化时获取元数据,然后根据expiration time进行周期更新。
    2. 生产者也会在request error occured时强制更新元数据,例如InvalidMetadataException

    但在ruby-kafka客户端中,通常会在发生错误或初始化时刷新元数据。

    【讨论】:

    • 这我知道制作人总是尽其所能与领导者建立联系。但是当生产者获取领导者是谁以及它产生消息时,领导者可能已经改变,因此出现 NotLeaderForPartitionException。但是这个异常是从哪里来的呢? broker是否总是在回复之前检查它是否是领导者?
    • @AvikantGupta Kafka Producer 在首次发送之前检索并缓存主题/分区元数据。然后它会定期尝试刷新此元数据,每个 metadata.max.age.ms(默认 = 5 分钟)表示“好”,每个 retry.backoff.ms 表示“无效”主题。这些元数据刷新尝试就是您在日志中观察到的。
    • 感谢您的回复和链接来源!因此,如果生产者每 5 分钟获取的元数据是 kafka 中唯一验证哪个经纪人是领导者。如果领导者在这 5 分钟内发生变化,那么 kafka 生产者应该能够在非领导者代理处生成消息。这种理解正确吗?
    • @AvikantGupta 值得注意的是,当我仔细检查源代码和文档时,我发现 java kafka 客户端还会在请求错误时强制更新元数据,除了周期更新。
    • 所以由于这个边缘导致我们可以在 kafka 中配置的最高一致性设置,如下所示:stackoverflow.com/a/54153523/12052871 甚至不足以将 kafka 用作一致性系统作为 kafka 的忠实粉丝这有点令人沮丧
    猜你喜欢
    • 2020-10-18
    • 2016-06-02
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2016-08-24
    • 2012-01-20
    • 2015-05-27
    相关资源
    最近更新 更多