java - Kafka 生产者在发送到通过 AdminClient createTopics 方法创建的主题时抛出 "Received unknown topic or partition error"

标签 java apache-kafka

我对使用 AdminClient createTopics 创建的主题有疑问.
在我的应用程序中,我有以下顺序:

  • 创建具有 1 个分区的新主题,使用 AdminClient.createTopics 将复制因子设置为 1
  • 稍等 AdminClient.createTopics KafkaFuture结果
  • 立即向新创建的主题发送新消息(通常操作 2 和操作 3 之间的时间约为 200 毫秒)。

  • 我的代码如下:
    adminClient
      .createTopics(Collections.singleton(new NewTopic(targetTopic, 1, (short) 1)))
      .values()
      .get(targetTopic)
      .get();
    producer.send(new ProducerRecord<>(targetTopic, data));
    

    有时生产者看不到创建的主题并抛出以下异常:

    [Producer clientId=producer-1] Error while fetching metadata with correlation id 5 : {targetTopic=UNKNOWN_TOPIC_OR_PARTITION}

    [Producer clientId=producer-1] Received unknown topic or partition error in produce request on partition targetTopic. The topic/partition may not exist or the user may not have Describe access to it



    这个问题非常罕见(< 0.1% 所有创建的主题)。

    是否保证当AdminClient.createTopics Kafka future 完成,然后创建主题,Kafka 生产者应该看到该主题?
    如果不是那么哪种主题创建方法可以给我这样的保证?

    我在 Azure 上使用 kafka-clients:2.0.0 和 Kafka HD 服务。我的集群由 3 个 Zookeeper 和 3 个 Kafka 节点组成。

    最佳答案

    Kafka 客户端不保证原子主题的创建。您可以从这里阅读 documentation .当您创建主题时,kafka 将通知分布式系统有关主题信息,因此操作在不同的机器上运行,如果没有分布式事务管理,这些就不能是原子的。

    关于java - Kafka 生产者在发送到通过 AdminClient createTopics 方法创建的主题时抛出 "Received unknown topic or partition error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53910783/

    相关文章:

    java - 如何在 servlet 过滤器中重定向?

    java - 线路问题拆分

    node.js - 卡夫卡-超时错误: Request timed out after 30000ms

    apache-kafka - 使用 kafka 检测值的变化

    java - 频繁出现 "offset out of range"消息,分区被消费者遗弃

    java - 如何从 map 叠加层传递值

    java gui图像问题: doesn't display in the background

    java - 为动态 Web 项目配置 JPA 提供程序

    hadoop - camus-使用kafka的例子

    ssl - 是否可以使用 Telegraf 配置安全(SSL)kafka?