在RabbitMQ中使用routinq密钥时,从另一个队列消耗消息

时间:2015-08-20 08:43:12

标签: rabbitmq

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

  • allAlarms,带有路由键警报。#:我希望这用于接收监控应用程序中的所有警报
  • alarms_ [deviceID],带路由键警报。[deviceID],设备数量在任何给定时间都可能有所不同

从设备发送警报时,我使用路由键警报发布它。[deviceID]。但是,监视应用程序仅从allAlarms队列中消耗。这会导致以下问题:queues in RabbitMQ Management

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

2 个答案:

答案 0 :(得分:1)

看起来你有消费者绑定到func队列但不绑定到任何allAlarms队列。

在AMQP中,单个使用者按名称绑定到单个队列(并且每个队列可以绑定多个使用者)。消息以循环方式传递给队列的消费者,使得对于队列中的给定消息,完全将接收消息的消费者。也就是说,消费者无法收听多个队列。

由于您正在使用主题交换,因此您通过路由键和队列绑定正确地将单个消息路由到多个队列。这意味着您可以为每个队列设置消费者,并且当消息传递到交换机时,每个队列将获得该消息的副本,并且每个队列将消息传递给完全< / em> 每个队列上的一个消费者

因此,如果alarms_[deviceID]正在消费消息,那是因为它有一个连接到队列的消费者。如果allAlarms中的任何一个没有消费消息,那么他们就不能让消费者绑定到那些单独的队列。您必须按名称为每个alarms_[deviceID]启动消费者。这将允许您为不同的队列使用不同的消费者逻辑。

最后一件事:

  

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

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

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

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

答案 1 :(得分:1)

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

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

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

因此,我会丢弃所有alarm_[deviceid]个队列,只有alarmAll个队列。

只需通过您的交换机发布警报,然后将它们全部发送到alarmAll队列,然后完成。不需要任何其他路由或队列。