当前位置: 首页 > 知识库问答 >
问题:

根据Kafka分区的数量动态调整消费者线程的数量

钱运浩
2023-03-14

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

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

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

org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1

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

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

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

共有1个答案

柴彬
2023-03-14

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

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

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

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

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

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

 类似资料:
  • 本文向大家介绍Kafka 的消费者如何消费数据相关面试题,主要包含被问及Kafka 的消费者如何消费数据时的应答技巧和注意事项,需要的朋友参考一下 消费者每次消费数据的时候,消费者都会记录消费的物理偏移量(offset)的位置 等到下次消费时,他会接着上次位置继续消费

  • 我知道kafka将一个主题的数据安排在许多分区上,一个消费者组中的消费者被分配到不同的分区,从那里他们可以接收数据: 我的问题是: 术语,它们是由主机/IP标识的,还是由客户端连接标识的? 换句话说,如果我启动两个线程或进程,使用相同的消费者组运行相同的Kafka客户端代码,它们被认为是一个消费者还是两个消费者?

  • 现在,让我们考虑另一个场景(我没有尝试过,但我很好奇),在这个场景中,我启动了两个使用者进程和,这两个进程都具有相同的组,并且它们都是一个单线程进程。现在我的问题是: > 在这种情况下,两个独立的使用者进程(在同一个组下)将如何与分区相关?与上面的单进程多线程场景有何不同? 一般来说,使用者线程或进程如何与主题中的分区映射/相关? 关于将消费者实现为进程与线程,我在这里遗漏了什么微妙的事情吗?提前

  • null 我在这一页上读到以下内容: 使用者从任何单个分区读取,允许您以与消息生成类似的方式扩展消息消耗的吞吐量。 也可以将使用者组织为给定主题的使用者组-组内的每个使用者从唯一分区读取,并且组作为一个整体使用来自整个主题的所有消息。 如果使用者多于分区,则某些使用者将空闲,因为它们没有可从中读取的分区。 如果分区多于使用者,则使用者将从多个分区接收消息。 如果使用者和分区的数量相等,则每个使用者

  • 我正在使用Spring Kafka消费者。我已将并发设置为10,并创建了5个消费者(用于5个主题)。所以有50个Spring Kafka消费者线程。 Kafka消费者可以使用的最大线程数是多少?如何增加此线程池的大小?我查阅了spring文档,但没有发现任何相关内容。

  • Flink kafka消费者有两种类型的消费者,例如: 这两个消费者层次结构扩展了相同的类。我想知道维护编号类背后的设计决策是什么?我们什么时候应该使用其中一种? 我注意到带有数字后缀的类有更多的特性(例如ratelimiting)。 https://github.com/apache/flink/blob/master/flink-connectors/flink-connector-kafka