Стратегия балансировки потребительской нагрузки Spring Cloud Stream - PullRequest
0 голосов
/ 27 сентября 2018

В соответствии с документацией Spring Cloud Stream:

Когда существует несколько экземпляров потребителей, связанных с одним и тем же именем группы, тогда сообщения сбалансированы по нагрузке между этими экземплярами потребителей, так что каждое сообщение отправляетсяпроизводитель использует только один потребительский экземпляр в каждой группе.

Я хотел бы понять стратегию балансировки нагрузки, используемую в этом контексте.Кроме того, хотелось бы понять, как на балансировку нагрузки на потребителей влияет использование следующих свойств:

spring.cloud.stream.bindings.input.consumer.concurrency
spring.cloud.stream.<binder>.bindings.input.consumer.prefetch

В нашем случае связующим является RabbitMQ.

Наше потребительское приложениепросто проход и не имеет никакой существенной логики.Наша полезная нагрузка - текстовое сообщение размером ~ 2 КБ.Нагрузка, создаваемая для обработки потребителем, составляет 10 КБ.

Когда у нас есть следующие конфигурации и до 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.Однако нам придется изменить нашу структуру полезной нагрузки, чтобы внедрить такую ​​стратегию.

Но перед этим нам хотелось бы понять, что если бы существовал эффективный способ балансировки нагрузки, просто используя оптимальное значение в свойствах потребителя.

...