是的,您确实需要为每个消费者排队。
你可以使用扇出交换
channel.ExchangeDeclare("database", ExchangeType.Fanout);
关于您的“额外信息”
作为关于我的项目的额外信息,我需要每个消费者接收发送的最后一条消息,他们不应该关心过去的消息,所以如果消费者在开始工作时不可用,它不应该收到所有过去的垃圾邮件通知。
您可以按照官方教程on this page 中的建议使用非持久的、独占的、自动删除的“临时队列”
channel.QueueDeclare();
以下是本页的两句话:
...我们也只对当前流动的消息感兴趣,而不是旧消息。
... 每当我们连接到 Rabbit 时,我们都需要一个新的空队列。为此,我们可以创建一个具有随机名称的队列,或者更好的是 - 让服务器为我们选择一个随机队列名称。
然后最后将队列绑定到exchange:
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/,我们得到以下
==============
提示
将来您可能希望区分不同类型的数据库更改(例如架构更改、数据更改)
为此,我将使用每个通知类型的“数据库”主题交换和路由键。
其余的将保持不变:
channel.ExchangeDeclare("database", ExchangeType.Topic);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
exchange: "database",
routingKey: "schema.changed");