在RabbitMQ中使用routinq密钥时使用来自另一队列的消息

在RabbitMQ中使用routinq密钥时使用来自另一队列的消息,rabbitmq,Rabbitmq,我定义了一个主题交换(报警)和多个队列,每个队列都有自己的路由键: allAlarms,带有路由键报警。#:我希望它用于接收监控应用程序中的所有报警 报警u[deviceID],带有路由键报警。[deviceID],其中设备的数量在任何给定时间都可能发生变化 当从设备发送警报时,我使用路由键alarms发布它。[deviceID]。然而,监控应用程序仅使用allAlarms队列中的数据。这会导致以下问题: allAlarms队列中的消息已被使用,而其余队列中的消息已准备就绪。有没有更好的方法

我定义了一个主题交换(报警)和多个队列,每个队列都有自己的路由键:

  • allAlarms,带有路由键报警。#:我希望它用于接收监控应用程序中的所有报警
  • 报警u[deviceID],带有路由键报警。[deviceID],其中设备的数量在任何给定时间都可能发生变化
当从设备发送警报时,我使用路由键alarms发布它。[deviceID]。然而,监控应用程序仅使用allAlarms队列中的数据。这会导致以下问题:


allAlarms队列中的消息已被使用,而其余队列中的消息已准备就绪。有没有更好的方法来处理来自多个消费者的消息?理想情况下,我还希望能够使用设备发布警报的相同队列将命令发送回设备。

看起来消费者绑定到
allAlarms
队列,但没有绑定到任何
警报[deviceID]
队列

在AMQP中,单个使用者通过名称绑定到单个队列(每个队列可以绑定多个使用者)。消息以循环方式传递给队列的使用者,以便对于队列中的给定消息,只有一个使用者将接收消息。也就是说,消费者无法侦听多个队列

由于您使用的是主题交换,因此您可以通过路由键和队列绑定将单个消息正确路由到多个队列。这意味着您可以为每个队列指定一个使用者,当消息传递到exchange时,每个队列将获得消息的副本,并且每个队列将仅向每个队列上的一个使用者传递消息

因此,如果
allAlarms
正在使用消息,那是因为它在队列中附加了一个消费者。如果任何
报警\uu[deviceID]
未使用消息,则它们不得将使用者绑定到这些单独的队列。您必须按名称为每个
报警启动消费者。这将允许您对不同的队列使用不同的使用者逻辑

最后一件事:

理想情况下,我希望能够使用设备发布警报的相同队列将命令发送回设备

您不希望使用相同的队列执行此操作,因为没有任何东西可以阻止队列中的非设备使用者拾取这些消息

我相信你在描述RabbitMQ上的RPC。为此,您需要将消息发布到带有
reply to
头的报警队列,该头是临时队列的名称。此临时队列是一个一次性队列,消费者在完成与设备的通信后将发布到该队列。设备将发布到报警交换,然后立即开始侦听临时队列,以获取使用者的响应


有关RPC over RabbitMQ的更多信息,请查看

我认为您不需要设备的任何队列--
报警[deviceid]
队列

您没有在这些队列上设置任何消费代码,消息将被备份并等待您使用它们

您还没有提到需要使用这些队列中的消息。相反,您只使用
alarmAll
队列中的消息

因此,我将删除所有
alarm\u[deviceid]
队列,而只有
alarmAll
队列


只需通过您的exchange发布警报,并将它们全部发送到
alarmAll
队列中,即可完成处理。不需要任何其他的路由或队列。

最后,在把笔写在纸上之后,我也想到了这一点。我现在只使用allAlarms。