当发送到通过AdminClient createTopics方法创建的主题时,Kafka生产者抛出“接收到的未知主题或分区错误”

时间:2018-12-24 08:06:56

标签: java apache-kafka

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

  1. 使用1个分区创建新主题,使用AdminClient.createTopics将复制因子设置为1
  2. 等待AdminClient.createTopics KafkaFuture的结果
  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上的生产请求中收到未知主题或分区错误。主题/分区可能不存在,或者用户可能没有“描述”权限

此问题非常严重(所有已创建主题的<0.1%)。

是否可以保证AdminClient.createTopics卡夫卡的未来完成后就可以创建主题,卡夫卡的制作人应该可以看到该主题? 如果不是,那么哪种主题创建方法可以给我这样的保证?

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

1 个答案:

答案 0 :(得分:1)

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