卡夫卡消费者并发性的适当值(与扩展有关)应为多少?

时间:2019-02-06 17:28:05

标签: apache-kafka spring-kafka

我正在创建一项新服务,它将成为Kafka主题的使用者。这是Spring应用程序,所以我正在使用spring-kafka。

主题有20个分区。最初,Kubernetes中有两个实例。将来,取决于负载,我们要扩展和运行其他实例。在我的情况下,kafka.consumer.concurrency的适当值应该是多少?我打赌那是10,对吗?

只有两个服务实例时,每个实例运行10个线程,并且每个线程都从一个分区读取。但是,如果我想扩展服务范围怎么办?如果再运行两个实例,将会发生什么?据我所知,当一个新的使用者加入一个使用者组时,这组使用者试图“重新平衡”负载,以便为每个使用者分配分区。

  1. 这是否意味着两个现有实例会将线程数减少到5,并且仅侦听5个分区(每个实例将处理5个分区)?
  2. 我的理解正确吗?
  3. 如果没有,在我的情况下合适的值是什么?

文档说:

  

如果分区多于线程,则某些线程将从多个分区接收数据

  1. 只需确保:如果我将并发设置为5,每个线程将从两个分区读取。会影响服务性能吗?

1 个答案:

答案 0 :(得分:1)

将新消费者添加到同一组时,Kafka将执行重新平衡;如果使用方的数量超过分区的数量,则无法保证每个实例将获得5个分区-Kafka只能看到40个使用方,而20个分区将被分配。但是,这可能取决于已配置的分配器-默认的 Id Event SeqNo 1 A 1 1 B 2 1 C 3 1 ABD 4 1 A 5 1 C 6 1 A 7 1 CDE 8 1 D 9 1 B 10 1 ABD 11 1 D 12 1 B 13 1 CDE 14 1 A 15 2 B 16 3 ABD 17 3 B 18 3 CDE 19 4 ABD 20 4 CDE 21 5 CDE 22 可能会这样做。

但是,当您超过分区数时,容器将具有空闲线程(未分配任何分区)。

通常,最佳实践是过度分配分区的数量,并让每个使用者处理多个分区。这样,当您进行横向扩展时;您最终不会遇到闲置的消费者。

  

如果没有,我的情况下合适的值是什么?

这完全取决于您的应用程序。

底线;如果您从2x10的使用者开始,并且希望最终可能需要10x10,则应该从100个分区开始。