如何使用来自多个主题的消息?

时间:2019-06-17 15:27:13

标签: java apache-kafka kafka-consumer-api

我正在尝试使用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);`

2 个答案:

答案 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