首页 文章

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

提问于
浏览
38

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

exclusive - 设置为true时,您的队列将变为私有,并且只能由您的应用程序使用 . 当您需要将队列限制为仅一个使用者时,这非常有用 . 自动删除 - 当最后一个使用者取消订阅时,将自动删除该队列 . 如果您需要仅由一个使用者使用的临时队列,请将auto-delete与exclusive结合使用 . 当消费者断开连接时,队列将被删除 .

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

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

result = channel.queue_declare(exclusive=True)

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

2 回答

  • 47

    确实,当消费者断开连接时, exclusive 队列将自动删除(请参阅下面粘贴的documentation) . 但是,有些情况下您希望队列是非独占的,但仍然是自动删除(例如,如果我想添加另一个消费者) .

    exclusive独占队列只能由当前连接访问,并在该连接关闭时删除 . 不允许通过其他连接被动声明独占队列 . auto-delete如果设置,则在所有使用者完成使用后删除队列 . 可以明确地取消最后一个消费者,也可以关闭其渠道 . 如果队列中没有消费者,则不会删除它 . 应用程序可以正常使用Delete方法显式删除自动删除队列 .

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

  • 7

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

相关问题