2011-07-08 142 views
2

我使用RabbitMQ需要的是:生产者生成消息并且接收者接收到全部消息,这些消息在首次连接到队列之后发布。RabbitMQ真实世界场景

由于消费者想要消费所有发布的消息。因为如果多个消费者连接到同一个队列,消费者将不会收到所有消息(另请参阅here)。因此,消费者必须创建一个'独占'队列并连接到所需的交换机。此外,它希望收到所有即使发生故障(未来)发布的消息。因此队列是'耐用'。现在,该方案如下所示:

消费者C1创建排队并持久的队列Q1。现在它已经关闭了一段时间,同时另一个用户C2尝试连接到队列Q1。 C2将会成功,因为Q1现在没有用户连接到它。所以,C2连接到独占和持久队列。现在,如果C1尝试连接到队列Q1,则它不能这样做,因为已经有用户C2订阅了队列Q1。

如何防止这种情况?

我希望我这次清楚。

回答

1

啊!简单的回答...我不知道关于消费者的这件事。使消费者独家。现在只有这个消费者可以连接到队列。但是,如果创建该消费者的渠道关闭,目的将失败。因此,如果使用排队或消费者,渠道决不能关闭。你可以找到更多关于这个here

0

也许消费者C2有可能使用相同的路由密钥创建自己的队列,然后接收自此之后发布的新消息。

如果C1回来,它可以使用它的上一个连接。两个消费者都收到消息。

+0

是的,你所说的完全没错。但有可能在C1关闭的时候,C2会尝试创建一个接收消息的队列。而且,无论如何,或者如果C2给出的queuename完全相同,C1就是这样使用的。那么,在那种情况下,我们的目的就会丧失。 –

+0

是的,但这就是为什么您必须确保消费者C2队列的名称不同。应该很容易为每个消费者的队列创建新名称。 – Fgblanch

0

我在昨天发布的同名问题中已经回答了这个问题,而且我不确定那里已经消失了。你删除了吗?

无论如何,答案(再次)是使用独特的命名方案。只要确保您的消费者使用某种形式的可预测但每个使用者唯一的密钥,并将其用作他们声明的队列名称。

您的应用程序有责任防止消费者C2连接到消费者C1的队列。 RabbitMQ不会奇迹般地阻止这种情况的发生。

+0

是的,我删除了它!我想我已经得到了正确的答案:让消费者独享。现在只有这个消费者可以连接到队列。我还没有对此进行任何研究。你可以在这里找到更多关于[这里](http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.consume)。 –

+0

现在我已经证实了这件事。只有当创建消费者的渠道始终处于启动状态时,即使独占消费者关闭,其他消费者也无法连接到该队列。 –

+1

好 - 发布它作为这个问题的答案并接受它。这样其他人将受益。 –