RabbitMQ - нужен канал на машину? - PullRequest
0 голосов
/ 30 мая 2019

У нас есть несколько бэкэнд-машин. Цель состоит в том, чтобы каждая машина принимала каждое сообщение, отправленное на один обмен RabbitMQ.

FooExchange установлен на fanout (поэтому он отправляет сообщение всем подключенным к нему очередям). FooExchange имеет одну очередь, FooQueue, которая связана с ней. Все наши машины являются потребителями FooQueue.

Это прекрасно работает локально, но когда у нас в игре несколько машин, появляется , что только ОДИН компьютер принимает сообщение одновременно. Он принимает сообщение специально 1 раз / сколько бы машин ни было. Это подтверждается старым ответом здесь .

У меня есть несколько вопросов:

  1. Является ли создание очереди для каждой машины лучшим способом для продолжения?
  2. "Машины" на самом деле будут модулями K8S - что я должен использовать в качестве уникального идентификатора машины в имени очереди? Или просто сделать экземпляр GUID и назвать его в день?
  3. Наконец, как мне выполнить перезапуски модуля (если вы не знакомы с K8S, подумайте о том, как облачный балансировщик нагрузки запускает новые экземпляры ВМ) - это оставит мертвую очередь, так как сменные модули / ВМ создают новые для использования.

Ответы [ 2 ]

1 голос
/ 30 мая 2019

1) Разветвленный обмен направляет все сообщения во все связанные очереди.Таким образом, ответ на ваш первый вопрос зависит от того, чего вы хотите достичь.Если вы хотите, чтобы каждый потребитель получал каждое сообщение, используйте обмен фантазиями, создайте очередь для каждого потребителя, привяжите его к обмену.Позволить каждому потребителю исключительно использовать сообщения из своей очереди.

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

2) Если вы используете первый подход, вы можете разрешить имена очередиавтоматически генерироваться для каждого потребителя при создании очереди.Это имя будет точным и уникальным.

3) RabbitMQ поддерживает временных очередей , которые удаляются, когда потребитель уходит.Если вам требуется, чтобы каждое сообщение использовалось хотя бы один раз, обязательно объявите обмен мертвыми буквами для сообщений, которые не могли быть использованы отправившимся потребителем.Это позволит вам перенаправить такие сообщения.

0 голосов
/ 30 мая 2019

Нет необходимости создавать FooQueue в каждом бэкэнде. RabbitMQ может поддерживать несколько соединений. Вы можете запустить RabbitMQ consumer на каждом из бэкэнд-машин. Убедитесь, что каждый consumer открывает новое соединение и получает из очереди. Если вы хотите, чтобы ваш потребитель принимал по одному сообщению за раз, установите базовое значение.

...