我有一个Spring Boot应用程序,其中使用单个KafkaConsumer对象从大约10个不同的Kafka主题中进行消费。该应用程序在Kubernetes上运行,因此有许多Pod并行运行。这些主题在通过它们传递的消息量上有很大的不同。我发现经常出现积压的Kafka主题,而其他主题总是被追上。
我知道,在没有足够的使用者吞吐量的情况下,高负载主题将积压,但是我想知道KafkaConsumer类是否正在并行处理这些主题。或者,是否每个主题都占用了轮询时间的一小部分,为所有主题分配了相等的资源,而不管其新消息的使用率如何?
以下是一些与我的实现类似的代码,删除了所有机密信息:
@Autowired
KafkaConsumer<String, String> kafkaConsumer;
@Audowired
CustomProcessor customProcessor;
public void consume() {
kafkaConsumer.subscribe(Arrays.asList("topic1", "topic2, "topic3", "topic4", "topic5");
while (true) {
ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
customProcessor.processMessage(record.value());
}
}
}
比方说, topic1 每秒有1000条消息,而其他每个主题每秒有50条消息。等待其他主题对消费第一个主题的吞吐量有什么影响?为高负载主题实例化一个单独的使用者对象会更好吗?