Нужна ли мне очередь для каждого потребителя в rabbitMQ?

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

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

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


person LuisRococo    schedule 01.04.2020    source источник
comment
Похоже, вы реализовали рабочую очередь, где каждое сообщение достается только одному потребителю. Но вместо этого вы, вероятно, захотите опубликовать и подписаться. См. эту страницу для обзора, включая более гибкие варианты, такие как темы.   -  person andrewjames    schedule 02.04.2020
comment
Публикация и подписка - это то, что мне нужно, спасибо   -  person LuisRococo    schedule 04.04.2020


Ответы (1)


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

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

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

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

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

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

channel.QueueDeclare();

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

  1. #P7#
  2. #P8#

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

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

Все вместе:

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

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

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

Намекать

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

channel.ExchangeDeclare("database", ExchangeType.Topic);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
                  exchange: "database",
                  routingKey: "schema.changed");
person Oran Gerbovski    schedule 03.04.2020
comment
Действительно полный ответ, код уже протестирован и выглядит нормально, спасибо, что заставили меня понять. - person LuisRococo; 04.04.2020