我已经定义了一个主题交换(警报)和多个队列,每个队列都有自己的路由密钥:
从设备发送警报时,我使用路由键警报发布它。[deviceID]。但是,监视应用程序仅从allAlarms队列中消耗。这会导致以下问题:
allAlarms队列中的消息已被使用,而其余队列中的消息已准备就绪。有没有更好的方法来处理来自多个消费者的消息?理想情况下,我希望能够使用设备发布警报的相同队列将命令发送回设备。
答案 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
队列,然后完成。不需要任何其他路由或队列。