Разделение. Всегда ли количество экземпляров потребителей должно соответствовать количеству разделов, предоставленному производителем?

В моем приложении Producer.properties у меня есть

spring.cloud.stream.bindings.output.producer.partitionKeyExpression=payload
spring.cloud.stream.bindings.output.producer.partitionCount=4

И мой потребительский application.properties выглядит так

spring.cloud.stream.bindings.input.consumer.partitioned=true
spring.cloud.stream.bindings.input.group=group01

Когда я развертываю свое приложение в Pivotal Cloud Foundry и масштабирую приложение до 2 экземпляров, я вижу, что создаются две очереди. Они привязаны к обмену суффиксами -0 и -1.

Но это означает, что если сообщение приходит с темой, оканчивающейся на -3 или -4, то они теряются, потому что для этих тем не существует привязок. Если я масштабирую потребителя до 4 экземпляров, он работает, как и ожидалось.

Мой вопрос: возможно ли иметь экземпляры потребителей меньше, чем partitionCount производителя? В этом случае одна или несколько очередей будут иметь несколько привязок к обмену.


person user3344591    schedule 18.08.2016    source источник


Ответы (2)


Это относится к RabbitMQ, который по умолчанию не является секционированным носителем — каждый раздел соответствует одному экземпляру/очереди. С Kafka мы поддерживаем несколько разделов для каждого потребителя (поэтому тема будет общей для нескольких экземпляров приложения). Мы рассматриваем возможность поддержки чего-то подобного для RabbitMQ, хотя сложность в этом конкретном случае заключается в том, что нелегко узнать, сколько всего разделов (кроме как путем проверки темы, которая подвержена ошибкам).

person Marius Bogoevici    schedule 18.08.2016

Нет. потребительских экземпляров не обязательно должны совпадать с нет. разделов в теме:

  1. Если нет. потребителей меньше разделов, то некоторые из экземпляров потребителей начинают извлекать данные из нескольких разделов.
  2. Если нет. потребителей больше, чем разделы, то некоторые из экземпляров потребителей никогда не получат никаких данных. Он просто останется без дела.
person Kamal Chandraprakash    schedule 19.08.2016
comment
Это верно для Kafka, но неверно для RabbitMQ, где клиенту выделяется только один раздел/очередь. - person Marius Bogoevici; 19.08.2016