根据Spring Cloud Stream文档:
当有多个使用同一组名称绑定的使用者实例时,消息将在这些使用者实例之间进行负载平衡,以便生产者发送的每条消息仅在每个组中的一个使用者实例中被使用。
我想了解在这种情况下使用的负载平衡策略。另外,想了解使用以下属性对消费者的负载平衡有何影响,
spring.cloud.stream.bindings.input.consumer.concurrency
spring.cloud.stream.<binder>.bindings.input.consumer.prefetch
在我们的案例中,活页夹是RabbitMQ。
我们的消费者应用程序只是一个传递,没有任何重要的逻辑。我们的有效载荷是纯文本消息,大小约为2 KB。消费者要处理的负载为1万条消息。
当我们采用以下配置并运行多达4或5个使用者实例时,
spring.cloud.stream.bindings.input.consumer.concurrency=10
spring.cloud.stream.rabbit.bindings.input.consumer.prefetch=5
负载似乎是均匀分布的,但是当我们开始将实例增加到5以上时,分布就不是均匀的,即,其中一个实例开始接收更多的负载,而其他实例处于空闲状态或只是不共享负载。均匀加载。
但是,如果我们开始减少并发和预取值,就会开始看到实例之间的一些均匀分布,即具有以下属性并且最多有10个实例,我们会观察到均匀分布。
spring.cloud.stream.bindings.input.consumer.concurrency=2
spring.cloud.stream.rabbit.bindings.input.consumer.prefetch=1
具有instanceCount
和instanceIndex
属性似乎无法产生预期的结果。
spring.cloud.stream.instanceCount
spring.cloud.stream.instanceIndex
尽管如此,我们了解这些instanceCount
和instanceIndex
属性在分区环境中更有意义。由于RabbitMQ不是自然分区的,因此我们可能看不到区别。
看起来我们应该能够在生产者中添加自定义分区策略,以使用RabbitMQ在队列之间分配负载。但是,我们将不得不更改有效负载结构以引入这种策略。
但是,在此之前,我们希望了解,如果有一种仅通过在使用者属性中使用最佳值来进行负载平衡的有效方法。