动态调整消费者线程数量以适应 Kafka 分区数量

loo*_*nis 1 spring apache-kafka spring-kafka

我有一个 Kafka 主题,有 50 个分区。
我的 Spring Boot 应用程序使用 Spring Kafka 来读取这些消息@KafkaListener

我的应用程序在 Kubernetes 中自动缩放的实例数量。

默认情况下,Spring Kafka 似乎为每个主题启动 1 个消费者线程。

org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1
Run Code Online (Sandbox Code Playgroud)

因此,对于应用程序的唯一实例,一个线程正在读取 50 个分区。
有 2 个实例,有负载平衡,每个实例监听 25 个分区。每个实例仍然有 1 个线程。

concurrency我知道我可以使用上的参数设置线程数@KafkaListener
但这是一个固定值。

有什么方法可以告诉 Spring 动态调整消费者线程的数量以适应客户端当前正在侦听的分区数量吗?

Tom*_*des 8

我认为可能有更好的方法来解决这个问题。

您应该通过负载/性能测试弄清楚应用程序的一个实例可以并行处理多少条记录/分区。

假设一个实例可以最佳地并行处理 10 个线程/记录。现在,如果您将应用程序扩展到 50 个实例,在您的方法中,每个实例将获得一个分区,并且每个实例的性能都将低于其容量,从而浪费资源。

现在考虑相反的情况 - 只剩下一个实例,它会生成 50 个线程来并行消耗所有分区。该应用程序的性能将大大降低,可能会变得无响应甚至崩溃。

因此,在这个假设的场景中,您可能想要做的是,例如,从一两个实例开始,每个实例处理所有分区,每个实例有 10 个线程,如果存在消费者延迟,则将其扩展到最多 5 个实例,以便每个分区有一个专门的线程处理它。

同样,实际数字应通过负载/性能测试来确定。