我有下一个问题,我有三个程序,当他们修改数据库时,它们应该向rabbitMQ发送一个通知(消息),每个程序也应该收到该通知,以便他们知道对数据库的修改。
我是使用RabbitMQ的新手,所以我不知道其工作方式,我有点理解官方页面上的“ hello world”教程,当我尝试与多个消费者(一个队列)一起使用时,他们收到了通知,所以我想我需要为每个消费者使用一个队列,但是我想知道在这种情况下这是否是使用RabbitMQ的正确方法。
作为关于我的项目的额外信息,我需要每个使用者都接收到最近发送的消息,他们不应该关心过去的消息,因此,如果使用者在开始工作时不可用,则不应接收所有过去通知的垃圾邮件。
是,您确实需要为每个使用者排队。
您可以使用扇出交换
channel.ExchangeDeclare("database", ExchangeType.Fanout);
以及关于您的“额外信息”
作为关于我的项目的额外信息,我需要每个使用者都接收到最近发送的消息,他们不应该关心过去的消息,因此,如果使用者在开始工作时不可用,则不应接收所有过去通知的垃圾邮件。
您可以使用官方教程on this page中建议的非持久,专有,自动删除的“临时队列”
channel.QueueDeclare();
这里有两个引号:
...我们也只对当前正在发送的消息感兴趣,而不对旧消息感兴趣。
...每当我们连接到Rabbit时,我们都需要一个全新的空队列。为此,我们可以创建一个具有随机名称的队列,或者甚至更好-让服务器为我们选择一个随机队列名称。
然后最终将队列绑定到交换:
channel.QueueBind(queue: queueName, exchange: "database", routingKey: "");
全部:
channel.ExchangeDeclare("database", ExchangeType.Fanout);
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName,
exchange: "database",
routingKey: "");
当然,每个程序都将具有发布者逻辑和订阅者逻辑。如果我们用“ 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");