我需要在RabbitMQ中为每个消费者排队吗?

时间:2020-04-01 19:48:55

标签: rabbitmq

我有下一个问题,我有三个程序,他们在修改数据库时应向RabbitMQ发送通知(消息),每个程序也应收到该通知,以便他们知道对数据库的修改。

我是使用RabbitMQ的新手,所以我不知道它的工作方式,我有点理解官方页面上的“ hello world”教程,当我尝试将其(一个队列)用于多个消费者时,只有一个他们中的每一个都收到了通知,所以我想我需要为每个消费者使用一个队列,但是我想知道在这种情况下这是否是使用RabbitMQ的正确方法。

作为有关我的项目的更多信息,我需要每个使用者都收到最后发送的消息,他们应该不在乎过去的消息,因此,如果使用者在开始工作时不可用,则不应收到过去的所有垃圾邮件。通知。

1 个答案:

答案 0 :(得分:1)

是的,您确实需要为每个消费者排队。

您可以使用扇出交换

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

关于您的“其他信息”

作为有关我的项目的更多信息,我需要每个使用者都收到最后发送的消息,他们应该不在乎过去的消息,因此,如果使用者在开始工作时不可用,则不应收到过去的所有垃圾邮件。通知。

您可以按照官方教程on this page

中的建议使用非持久的专有自动删除“临时队列”
channel.QueueDeclare();

以下是此页面中的两个引号:

  1. ...我们也只对当前正在发送的消息感兴趣,而对旧消息不感兴趣。

  2. ...每当我们连接到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/,我们将得到以下routing topology

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

提示

将来,您可能希望区分不同类型的数据库更改(例如,更改架构,更改数据) 为此,我将使用“数据库”主题交换和每个通知类型的路由键。 其余的将保持不变:

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