【发布时间】:2023-02-17 19:18:25
【问题描述】:
如果 kafka 消费者的数量(远)大于分区数量,分区数量是否会成为性能瓶颈?
假设我有一个名为 the-topic 的主题,只有三个分区。
现在,我有这个下面的应用程序,以便从主题中消费:
@Service
public class MyConsumer implements CommandLineRunner {
@Autowired
private KafkaReceiver<String, String> kafkaReceiver;
@Override
public void run(String... args) {
myConsumer().subscribe();
}
public Flux<String> myConsumer() {
return kafkaReceiver.receive()
.flatMap(oneMessage -> consume(oneMessage))
.doOnNext(abc -> System.out.println("successfully consumed {}={}" + abc))
.doOnError(throwable -> System.out.println("something bad happened while consuming : {}" + throwable.getMessage()));
}
private Mono<String> consume(ConsumerRecord<String, String> oneMessage) {
// this first line is a heavy in memory computation which transforms the incoming message to a data to be saved.
// it is very intensive computation, but has been tested NON BLOCKING by different tools, and takes 1 second :D
String transformedStringCPUIntensiveNonButNonBLocking = transformDataNonBlockingWithIntensiveOperation(oneMessage);
//then, just saved the correct transformed data into any REACTIVE repository :)
return myReactiveRepository.save(transformedStringCPUIntensiveNonButNonBLocking);
}
}
我将应用程序 docker 化并部署在 Kubernetes 中。
借助云提供商,我能够轻松部署其中的 60 个容器和 60 个应用程序。
并假设为了这个问题,我的每个应用程序都具有超强的弹性,从不崩溃。
这是否意味着,由于主题只有三个分区,任何时候都会浪费 57 个其他消费者?
当分区数量较少时,如何从扩展容器数量中获益?
【问题讨论】:
-
为什么需要 60 个消费者?这背后的逻辑是什么。增加分区数量会增加吞吐量,但也会有一些缺点,例如在进行新领导者选举时会增加停机时间。您目前有 3 个分区,如果有 60 个消费者,那么这些消费者中的大多数将处于非活动状态。通常你应该有和分区一样多的消费者
标签: java apache-kafka reactor-kafka