RabbitMQ队列的属性

在之前使用RabbitMQ的时候,如果对其队列不是特别清楚的话,可能在一些操作时会产生一定的疑问,如我们在RabbitMQ的消费者端时,首先创建了一个队列,然后绑定了一个路由键,如下:
在这里插入图片描述

上述就是我们之前介绍RabbitMQ的时候,最经常使用的方式,但是假设上述我们发现我们一不小心写错了,该队列应该绑定的路由键是bxs2,然后我们就将上述代码修改完后,再次重新启动,这时我们就会发现上述代码不仅获取到bxs2路由键的消息,而且也获取到了bxs1的消息。


因为上述在创建队列时,其中的参数autoDelete=false,所以当消费者断开连接时,队列不会被删除,之前绑定的路由键bxs1仍然有效,所以我们需要进行对其解绑,如下:
在这里插入图片描述

或者我们在RabbitMQ的控制台页面将该队列进行手动删除也可,当然我们也是可以将该队列设置为自动删除队列的,如下:


自动删除队列

如果我们将其上述参数autoDelete置为 true 的话,那么当消费者断开连接时,队列将会被删除。自动删除队列允许的消费者没有限制,也就是说当这个队列上最后一个消费者断开连接才会执行删除。
在这里插入图片描述


另外之前有时我们自己没有进行定义其队列进绑定的话,而是直接获取系统的随机队列,该队列缺省就是自动删除的。
在这里插入图片描述



单消费者队列

从上述截图我们发现,在创建队列时,还存在其他参数,这里我们再来看看exclusive参数,该参数表示该队列是否为单消费者队列。


之前我们介绍过一个队列是可以有多个消费者进行消费的,其消息会轮询发送给所有的消费者,如果我们在创建队列时设定属性exclusivetrue,即可设置队列为排他性队列,即单消费者队列
在这里插入图片描述

其中比较有意思的就是,设置exclusive=true其实并不是严格意义上的单消费者队列,也就是说该队列就算设置了exclusive=true,有些情况也是可以被多个消费者进行消费者的,如我们在RabbitMQ的基础使用 —— Direct模式(二)中介绍的同一个连接中不同信道的消费者对同一队列的消费,还有在RabbitMQ的QOS预取模式中提到的同一信道中不同消费者对同一队列的消费。


因为队列设置了exclusive=true,只对首次声明它的连接(Connection)可见,只要是当前connection下的信道都可以访问,所以是基于连接的。一旦该队列被声明,其他连接无法声明相同名称的排他队列。


另外单消费者队列在连接断开时(注意不是信道断开)也会被自动删除,即使队列声明为持久化队列durable=true也是无效的。



持久化队列

持久化队列和非持久化队列的区别是,持久化队列会被保存在磁盘中,固定并持久的存储,当RabbitMQ服务重启后,该队列仍会保持原来的状态在RabbitMQ中被管理,而非持久化队列不会被保存在磁盘中,Rabbit服务重启后队列就会消失。


非持久化比持久化的优势就是,由于非持久化不需要保存在磁盘中,所以使用速度就比持久化队列快。即非持久化的性能要高于持久化。而持久化的优点就是会一直存在,不会随服务的重启或服务器的宕机而消失。


在声明队列时,将属性durable设置为 false,则该队列为非持久化队列,若设置成 true 时,该队列就为持久化队列
在这里插入图片描述



队列其他参数设置

另外我们在上述介绍中,在channel.queueDeclare()方法中还有一个参数arguments参数没有进行介绍,这个参数其实我们在RabbitMQ死信交换器中,已经介绍过了,不过该参数还不仅可以用来设置死信交换器,其还有更多的队列控制参数,如下:

参数名 说明
x-dead-letter-exchange 死信交换器
x-dead-letter-routing-key 死信消息的可选路由键
x-expires 队列在指定毫秒数后被删除
x-ha-policy 创建HA队列
x-ha-nodes HA队列的分布节点
x-max-length 队列的最大消息数
x-message-ttl 毫秒为单位的消息过期时间,队列级别
x-max-priority 最大优先值为255的队列优先排序功能

其用法其实和我们之前使用的RabbitMQ死信交换器类似,这里我们就再来看看其队列的过期时间x-expires,以及队列消息的过期时间x-message-ttl,如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章