如果删除过期的主题,kafka使用者将在日志中保持刷新unknown_topic警告

时间:2019-03-12 06:52:45

标签: apache-kafka

最近,我们使用flink使用正则表达式模式使用kafka主题。发现当我们删除一些未使用的主题时,日志将继续刷新UNKNOWN_TOPIC_EXCEPTION。

我研究了kafka客户端的源代码,发现对于消费者而言,metadata中的topicExpiry被禁用,这导致即使删除了该主题,客户端仍在元数据的主题列表中保留该主题信息,并继续获取从服务器。

有没有什么好的方法可以避免在不修改kafka源代码的情况下出现此烦人的警告日志? (我们仍然需要“真实”未知主题例外,这意味着在日志中不是过时的主题)

以下代码可用于重现此问题(如果您在kafka集群中创建多个主题,例如“ test1”,“ test2”,“ test3” ...“ testn”,然后在运行时删除其中任何一个) 。

public static void main(String [] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092\n");
        props.put("group.id", "test10");
        props.put("enable.auto.commit", "true");
        props.put("auto.commit.interval.ms", "1000");
        props.put("auto.offset.reset", "earliest");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("metadata.max.age.ms", "60000");
        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);

        class PartitionOffsetAssignerListener implements ConsumerRebalanceListener {

            private KafkaConsumer<String, String> consumer;

            public PartitionOffsetAssignerListener(KafkaConsumer kafkaConsumer) {
                this.consumer = kafkaConsumer;
            }

            public void onPartitionsRevoked(Collection<TopicPartition> partitions) {

            }

            public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
                //reading all partitions from the beginning
                consumer.seekToBeginning(partitions);
            }
        }

        consumer.subscribe(Pattern.compile("^test.*$"), new PartitionOffsetAssignerListener(consumer));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(100);
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
        }
}

0 个答案:

没有答案