Java 一个使用者多个主题会导致潜在的线程问题吗?

Java 一个使用者多个主题会导致潜在的线程问题吗?,java,multithreading,hadoop,apache-kafka,Java,Multithreading,Hadoop,Apache Kafka,我有一个REST服务,我们称之为MDD,它有一个kafka消费者。当我第一次启动rest服务时,另一个服务告诉MDD的消费者订阅一个特定的主题,一切似乎都很顺利 然后服务告诉MDD的消费者订阅另一个主题。我现在的做法是通过consumer.assign()方法。基本上,如果引入了一个新主题,而消费者没有被分配到该主题,我会将这个新主题分配给消费者。因此,一个消费者现在被分配到两个不同的主题 此消费者轮询消息并将其存入HDFS 现在我注意到的是,当第二个主题的订阅进来时,有时我会得到一个错误,即无

我有一个REST服务,我们称之为MDD,它有一个kafka消费者。当我第一次启动rest服务时,另一个服务告诉MDD的消费者订阅一个特定的主题,一切似乎都很顺利

然后服务告诉MDD的消费者订阅另一个主题。我现在的做法是通过consumer.assign()方法。基本上,如果引入了一个新主题,而消费者没有被分配到该主题,我会将这个新主题分配给消费者。因此,一个消费者现在被分配到两个不同的主题

此消费者轮询消息并将其存入HDFS

现在我注意到的是,当第二个主题的订阅进来时,有时我会得到一个错误,即无法在HDFS中附加到文件,当我查看日志时,它试图附加一些稍后才应该附加的数据。 例如,kafka的数据按以下顺序排列:A、B、C。当MDD将A附加到HDFS后,它会尝试附加C(而不是B),同时也会尝试附加B。另一个注意事项是,此时没有来自第一个主题的数据,只有来自第二个主题的数据流入。因此,目前,在任何给定时间,只有一个卡夫卡主题具有数据流

有人知道会发生什么吗?当我将一个消费者分配给多个主题时,是否会产生一些线程问题?因为当消费者被分配到一个主题时,一切似乎都很顺利,但一旦它被分配到多个主题,我就无法在HDFS中追加到文件中,因为其他一些编写器已经拥有租约。这种错误并不经常发生,只是非常随机


另外,建议的修复方法是每次创建一个新主题时,创建一个新的卡夫卡消费者吗

只让一个消费者阅读多个主题的消息绝对是有效和可行的。您遇到的问题是因为Kafka当前不支持使用手动分区分配(使用KafkaConsumer#assign)和组管理(使用KafkaConsumer#subscribe)


为了支持订阅新创建的主题,您可以尝试调用KafkaConsumer#subscribe,将正则表达式传递给它,匹配所有新创建的主题。

只有一个消费者从多个主题读取消息是绝对有效和可行的。您遇到的问题是因为Kafka当前不支持使用手动分区分配(使用KafkaConsumer#assign)和组管理(使用KafkaConsumer#subscribe)


要支持订阅新创建的主题,您可以尝试调用KafkaConsumer#subscribe,将正则表达式传递给它,以匹配所有新创建的主题。

请详细说明一下:您遇到的问题是因为Kafka目前不支持使用手动分区分配两者(与KafkaConsumer#assign合作)和集团管理层(与KafkaConsumer#subscribe合作)。我仍然不明白问题的原因。简单地说,你不应该同时使用kafkanconsumer.subscribe和kafkanconsumer.assign,所以请坚持只使用其中一个。我只使用了一个。首先我使用了assign,然后我尝试切换到subscribe,但仍然遇到相同的错误。你能详细说明一下这个问题吗遇到这种情况是因为Kafka目前不支持使用手动分区分配(使用KafkanConsumer#assign)和组管理(使用KafkanConsumer#subscribe)。我仍然不明白问题的原因。简单地说,您不应该同时使用kafkanconsumer.subscribe和kafkanconsumer.assign,因此请坚持只使用其中一个。我只使用了一个。首先我使用了assign,然后我尝试切换到subscribe,但仍然会出现相同的错误