排他队列

更新时间:

如果您想创建一个只有自己可见的队列,不允许其他用户访问,您可以使用云消息队列 RabbitMQ 版的排他性队列特性,将指定的队列声明为排他性。

什么是排他队列

排他性队列的特点如下:

  • 排他队列只对首次声明它的连接(Connection)可见,包括该连接下所有建立的Channel。

    其他连接无法声明相同名称的排他队列,且其他连接以及连接下的Channel都无法访问该排他队列。

  • 连接断开时排他性队列会被自动删除。

    即使客户端已声明该排他队列为持久性的(durabletrue),只要该排他性队列的连接断开,队列会被自动删除,且队列中的数据也会被删除。

适用场景

排他队列适用于生产者和消费者在同一进程中,且对数据丢失不敏感的场景。

使用风险

因为排他队列连接断开队列自动删除的特性,以下场景连接意外断开时,会导致队列被删除且数据被清理。

  • 客户端程序调用Close()方法被关闭。

  • 服务端升级或异常重启。

  • 连接心跳超时导致连接空闲。

  • 其他错误导致连接被关闭,例如被限流等。

因此,您在使用排他队列前请谨慎评估队列可能被自动删除的风险,并考虑队列数据丢失的场景。

如何声明排他队列

排他队列在客户端程序中通过channel.queueDeclare方法声明,将exclusive设置为true

以Java语言为例,声明方式如下:

/**
* queue: 队列名称。
* durable: 是否持久化队列。
* exclusive: 是否是排他队列。
* autoDelete:是否自动删除队列。
* arguments: 其他参数。
*/
channel.queueDeclare("queueName", true, true, false, null);