根据kafka javadocs上的文件,如果我:
应该发生重新平衡,这会使消费者从该新主题中读取内容。但那并没有发生。
如果我停止并启动消费者,它确实会选择新主题。所以我知道新主题与模式匹配。在https://stackoverflow.com/questions/37120537/whitelist-filter-in-kafka-doesnt-pick-up-new-topics中可能存在此问题的重复,但这个问题无处可去。
我看到了kafka日志并且没有错误,它只是不会触发重新平衡。当消费者加入或死亡时触发重新平衡,但是在创建新主题时不会触发(即使将分区添加到现有主题,但这是另一个主题)。
我正在使用kafka 0.10.0.0和“新消费者API”的官方Java客户端,意思是代理GroupCoordinator而不是胖客户端+ zookeeper。
这是样本消费者的代码:
public class SampleConsumer {
public static void main(String[] args) throws IOException {
KafkaConsumer<String, String> consumer;
try (InputStream props = Resources.getResource("consumer.props").openStream()) {
Properties properties = new Properties();
properties.load(props);
properties.setProperty("group.id", "my-group");
System.out.println(properties.get("group.id"));
consumer = new KafkaConsumer<>(properties);
}
Pattern pattern = Pattern.compile("mytopic.+");
consumer.subscribe(pattern, new SampleRebalanceListener());
while (true) {
ConsumerRecords<String, String> records = consumer.poll(1000);
for (ConsumerRecord<String, String> record : records) {
System.out.printf("%s %s\n", record.topic(), record.value());
}
}
}
}
在制作人中,我正在向名为mytopic1,mytopic2等的主题发送消息。
如果未触发重新平衡,模式几乎无用。
你知道为什么没有发生再平衡吗?
答案 0 :(得分:6)
文档提及&#34;模式匹配将针对检查时存在的主题定期进行。&#34;。事实证明,&#34;定期&#34;对应于metadata.max.age.ms属性。通过将该属性(在我的代码示例中的#34; consumer.props&#34;内部)设置为5000,我可以看到它每5秒检测一次新主题和分区。
根据此jira机票https://issues.apache.org/jira/browse/KAFKA-3854:
,这是按照设计的关于JIRA的最后一点,说明在创建时不会将消费者订阅模式的后来创建的主题分配给消费者,这似乎是按照设计的。处理该情况需要重复订阅相同模式的subscribe()。
刷新元数据轮询执行&#34;重复订阅()&#34;在机票中提到。
这是令人困惑的来自Kafka 0.8,其中有真正的触发基于zookeper手表,而不是轮询。对于这种情况,IMO 0.9更像是降级,而不是&#34;正好及时#34;重新平衡,这会成为带有开销的高频率轮询,或者是在对新主题/分区作出反应之前长时间进行低频率轮询。
答案 1 :(得分:-1)
要立即触发重新平衡,您可以在订阅主题后显式地进行轮询调用:
kafkaConsumer.poll(pollDuration);