RabbitMQ独占和自动删除的区别?

时间:2014-01-21 03:28:07

标签: rabbitmq

第19页的“RabbitMQ in Action”一书给出了独占和自动删除的描述:

  

exclusive - 当设置为true时,您的队列将变为私有,并且只能   由您的应用程序使用。当您需要限制队列时,这非常有用   只有一个消费者。

     

自动删除 - 最后一次自动删除队列   消费者取消订阅。如果需要仅由一个使用的临时队列   消费者,将自动删除与独占结合起来。当消费者   断开连接,队列将被删除。

但据我所知,使用独占时,自动删除是多余的。只需要独家。 RabbitMQ tutorial似乎就是这样说的

  

...一旦我们断开消费者,就应该删除队列。有   这是一个独家标志:

result = channel.queue_declare(exclusive=True)

在该教程中没有提及自动删除和sudo rabbitmqctl list_bindings似乎表明在接收器离开后队列实际上被删除了。

2 个答案:

答案 0 :(得分:50)

当消费者断​​开连接时,exclusive队列确实会自动删除(请参阅下面粘贴的documentation)。但是,在某些情况下,您希望队列是非独占的,但仍然会自动删除(例如,如果我想添加其他消费者)。

  

<强>独家

     

独占队列只能由当前连接访问,并在该连接关闭时删除。不允许通过其他连接被动声明独占队列。

     

自动删除

     

如果设置,则在所有使用者完成使用后删除队列   它。最后一个消费者可以明确地或因为取消   它的频道已关闭。如果队列中没有消费者,那就是   不会被删除。应用程序可以明确删除自动删除   正常使用Delete方法排队。

就个人而言,我更喜欢不使用这些参数,而是选择RabbitMQ queue expiration参数,如果我有消费者断开连接然后立即(或短时间)重新连接,那么这个参数会更好;在这种情况下,消息不会丢失。但是,当然这一切都取决于您的应用和要求。

答案 1 :(得分:7)

与Mayer所描述的相反,我的测试表明,当self设置为true时,切换自动删除时的行为会有所不同。如果auto-delete设置为false,则队列确实与连接关联,并在连接终止时消失。如果将auto-delete设置为true,则在取消最后一个使用者后将删除该队列。连接和消费者之间存在差异。您可以连接,但不能使用给定的队列。如果您需要将队列的生命周期与您的连接绑定,而不是与您是否主动使用它,请将auto-delete设置为false并与exclusive = true一起使用。