【问题标题】:Kafka producer throws "Received unknown topic or partition error" when sending to topic created via AdminClient createTopics methodKafka 生产者在发送到通过 AdminClient createTopics 方法创建的主题时抛出“收到未知主题或分区错误”
【发布时间】:2019-05-23 11:03:21
【问题描述】:

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

  1. 创建具有 1 个分区的新主题,使用 AdminClient.createTopics 将复制因子设置为 1
  2. 等待AdminClient.createTopicsKafkaFuture结果
  3. 立即向新创建的主题发送一条新消息(通常操作 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] 获取关联 ID 为 5 的元数据时出错:{targetTopic=UNKNOWN_TOPIC_OR_PARTITION}

[Producer clientId=producer-1] 在分区 targetTopic 的生产请求中收到未知主题或分区错误。主题/分区可能不存在,或者用户可能没有描述访问权限

这个问题非常罕见(

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

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

【问题讨论】:

    标签: java apache-kafka


    【解决方案1】:

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

    【讨论】:

    • 谢谢你的回答,有没有什么机制可以让我保证主题是真的创建的?我正在考虑在 Kafka 代理上启用主题自动创建(由于安全原因我并不真正想要)或将复制因子值设置为等于节点数。
    • 我不知道任何机制,但你可以编写它。创建后,如果信息正确,请在循环中检查主题信息,然后打破循环执行下一步。但是,如果您可以将主题的创建和发布步骤分开,我认为这可能会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2018-07-27
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多