我正在创建一项新服务,它将成为Kafka主题的使用者。这是Spring应用程序,所以我正在使用spring-kafka。
主题有20个分区。最初,Kubernetes中有两个实例。将来,取决于负载,我们要扩展和运行其他实例。在我的情况下,kafka.consumer.concurrency
的适当值应该是多少?我打赌那是10,对吗?
只有两个服务实例时,每个实例运行10个线程,并且每个线程都从一个分区读取。但是,如果我想扩展服务范围怎么办?如果再运行两个实例,将会发生什么?据我所知,当一个新的使用者加入一个使用者组时,这组使用者试图“重新平衡”负载,以便为每个使用者分配分区。
文档说:
如果分区多于线程,则某些线程将从多个分区接收数据
答案 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个分区开始。