Да, вам нужна очередь для каждого потребителя.
Вы можете использовать разветвленный обмен
channel.ExchangeDeclare("database", ExchangeType.Fanout);
и относительно вашей "дополнительной информации"
В качестве дополнительной информации о моем проекте мне нужно, чтобы каждый потребитель получал последнее отправленное сообщение, ему не нужно заботиться о прошлых сообщениях, поэтому, если потребитель не доступен, когда он начинает работать, он не должен получать спам обо всех прошлых уведомлениях.
Вы можете использовать недлительный, эксклюзивный, автоудаление «Временная очередь», как предлагается в официальном руководстве на этой странице
channel.QueueDeclare();
Вот два цитаты с этой страницы:
... Нас также интересуют только текущие сообщения, а не старые.
... всякий раз, когда мы подключаемся к 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/, мы получим следующее
==============
Подсказка
В будущем вы можете захотеть различать различные типы изменений базы данных (например, схема изменилась, данные изменились) ) Для этого я бы использовал «базу данных» topi c обмена и маршрутизации ключей для каждого типа уведомлений. Остальные останутся прежними:
channel.ExchangeDeclare("database", ExchangeType.Topic);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
exchange: "database",
routingKey: "schema.changed");