我正在尝试使用assign()
方法使用来自多个主题的消息。通过实施,有时我可以使用所有主题中的消息,而有时仅使用一个主题中的消息。经过研究,我发现Kafka默认使用范围分配器。因此,它不会总是分配所有分区。
对于我的用例,我应该能够使用所有主题和分区。
我尝试通过设置RoundRobin分配器。但这没有帮助
List<TopicPartition> topicPartitions = new ArrayList<>();
KafkaConsumer kafkaConsumer = new KafkaConsumer<>(consumerConfig);
for (String topic : topics) {
topicPartitions.add(new TopicPartition(topic, 0);
}
kafkaConsumer.assign(topicPartitions);
ConsumerRecords<String, String> records = kafkaConsumer.poll(600);`
答案 0 :(得分:1)
KafkaConsumer.assign通常用于复杂的用例,在这些用例中,您不仅要控制主题,而且要控制消耗的分区。如果您只是想从几个主题(及其所有分区)中进行消费,则应使用KafkaConsumer.subscribe。
consumer.subscribe(Arrays.asList("topic1", "topic2"));
查看javadoc javadoc,该文档也显示了代码示例。
编辑:如果您需要控制分区分配,则确实需要使用assign()方法,但是在您的(不完整)代码示例中,您看起来像是在分配每个主题的分区0 ;因此您只会使用分区0的消息。
如果需要手动控制偏移量,您仍然可以使用订阅,但是您可以禁用自动提交,并使用seek()和commitSync()或commitAsync()来控制偏移量。
答案 1 :(得分:0)
以下应为您解决问题:
web: gunicorn MODULE_NAME:app --workers=1