RabbitMQ真实场景

时间:2011-07-08 08:16:19

标签: rabbitmq

使用RabbitMQ需要的是:生成器生成消息,接收者接收所有消息,这些消息在首次连接到队列之后发布。

由于消费者想要消费所有发布的消息。因为,如果多个消费者连接到同一个队列,那么消费者将不会收到所有消息。(另请参阅here)。因此,消费者必须创建'独占'队列并连接到所需的交换。此外,它希望接收所有已发布的消息,即使它已关闭(将来)。因此队列'持久'。现在,场景如下:

消费者C1创建一个排他性且耐用的队列Q1。现在它已经停止了一段时间,同时另一个用户C2尝试连接到队列Q1。 C2将成功,因为Q1现在没有订户连接到它。因此,C2连接到独占且持久的队列。现在,如果C1尝试连接到队列Q1,则不能这样做,因为消费者C2已经订阅了队列Q1。

如何防止这种情况?

我希望,这次我很清楚。

3 个答案:

答案 0 :(得分:1)

唉唉!!简单的回答......我不知道这个关于消费者的事情。使消费者独占。现在只有这个消费者可以连接到队列。但是,如果创建该消费者的渠道已关闭,则目的将失败。因此,如果使用独占队列或消费者,则不得关闭频道。您可以找到有关此here的更多信息。

答案 1 :(得分:0)

也许消费者C2可以用相同的路由密钥创建自己的队列,然后接收从那时起发布的新消息。

如果C1回来,它可以使用它之前的连接。并且两个消费者都收到了消息。

答案 2 :(得分:0)

我已经在你昨天发布的类似名称的问题中回答了这个问题,我不确定它在哪里消失了。你删除了吗?

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

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