如果您想创建一个只有自己可见的队列,不允许其他用户访问,您可以使用云消息队列 RabbitMQ 版的排他性队列特性,将指定的队列声明为排他性。
什么是排他队列
排他性队列的特点如下:
排他队列只对首次声明它的连接(Connection)可见,包括该连接下所有建立的Channel。
其他连接无法声明相同名称的排他队列,且其他连接以及连接下的Channel都无法访问该排他队列。
连接断开时排他性队列会被自动删除。
即使客户端已声明该排他队列为持久性的(
durable
为true
),只要该排他性队列的连接断开,队列会被自动删除,且队列中的数据也会被删除。
适用场景
排他队列适用于生产者和消费者在同一进程中,且对数据丢失不敏感的场景。
使用风险
因为排他队列连接断开队列自动删除的特性,以下场景连接意外断开时,会导致队列被删除且数据被清理。
客户端程序调用
Close()
方法被关闭。服务端升级或异常重启。
连接心跳超时导致连接空闲。
其他错误导致连接被关闭,例如被限流等。
因此,您在使用排他队列前请谨慎评估队列可能被自动删除的风险,并考虑队列数据丢失的场景。
如何声明排他队列
排他队列在客户端程序中通过channel.queueDeclare
方法声明,将exclusive
设置为true
。
以Java语言为例,声明方式如下:
/**
* queue: 队列名称。
* durable: 是否持久化队列。
* exclusive: 是否是排他队列。
* autoDelete:是否自动删除队列。
* arguments: 其他参数。
*/
channel.queueDeclare("queueName", true, true, false, null);