Требуется ли очередь для каждого потребителя в rabbitMQ? - PullRequest
1 голос
/ 01 апреля 2020

У меня следующая проблема, у меня три программы, и они должны отправлять уведомление (сообщение) rabbitMQ, когда они изменяют базу данных, также каждая программа должна получать это уведомление, чтобы они знали об этой модификации базы данных.

Я новичок в использовании rabbitMQ, поэтому я не знаю, как работать, я вроде понимаю учебник "hello world" на официальной странице, и когда я пытался использовать его (одна очередь) с несколькими потребителями, только один из них получили уведомление, поэтому я предполагаю, что мне нужно использовать очередь для каждого потребителя, но я хочу знать, является ли это правильным способом работы с rabbitMQ в этой ситуации.

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

1 Ответ

1 голос
/ 03 апреля 2020

Да, вам нужна очередь для каждого потребителя.

Вы можете использовать разветвленный обмен

channel.ExchangeDeclare("database", ExchangeType.Fanout);

и относительно вашей "дополнительной информации"

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

Вы можете использовать недлительный, эксклюзивный, автоудаление «Временная очередь», как предлагается в официальном руководстве на этой странице

channel.QueueDeclare();

Вот два цитаты с этой страницы:

  1. ... Нас также интересуют только текущие сообщения, а не старые.

  2. ... всякий раз, когда мы подключаемся к Rabbit, нам нужна свободная sh пустая очередь. Чтобы сделать это, мы могли бы создать очередь со случайным именем или, что еще лучше, - позволить серверу выбрать для нас случайное имя очереди.

И затем, наконец, связать очередь на обмен:

channel.QueueBind(queue: queueName, exchange: "database", routingKey: "");

Все вместе:

channel.ExchangeDeclare("database", ExchangeType.Fanout);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
                  exchange: "database",
                  routingKey: "");

Конечно, у каждой программы будут логи издателя c и логи подписчика c. И если мы назвали 3 программы с «A», «B» и «C», а затем воспользовались инструментом онлайн-симулятора http://tryrabbitmq.com/, мы получим следующее routing topology

==============

Подсказка

В будущем вы можете захотеть различать различные типы изменений базы данных (например, схема изменилась, данные изменились) ) Для этого я бы использовал «базу данных» topi c обмена и маршрутизации ключей для каждого типа уведомлений. Остальные останутся прежними:

channel.ExchangeDeclare("database", ExchangeType.Topic);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
                  exchange: "database",
                  routingKey: "schema.changed");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...