抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

RabbitMQ-相关属性

RabbitMQ队列的属性

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

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

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

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

自动删除队列

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

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

1
2
//获取临时队列
String queueName = channel.queueDeclare().getQueue();

单消费者队列

​ 从上述截图我们发现,在创建队列时,还存在其他参数,这里我们再来看看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,如下:

RabbitMQ消息的属性

​ 在[RabbitMQ队列的属性]中,我们介绍了RabbitMQ中队列的一些属性配置,这里我们再来看看RabbitMQ中消息的控制,如下:

参数 说明
content-type 消息体的MIME类型,如application/json
content-encoding 消息的编码类型,如是否压缩
message-id 消息的唯一性标识,由应用进行设置
correlation-id 一般用做关联消息的message-id,常用于消息的响应
timestamp 消息的创建时刻,整形,精确到秒
expiration 消息的过期时刻, 字符串,但是呈现格式为整型,精确到秒
delivery-mode 消息的持久化类型,1为非持久化,2为持久化,性能影响巨大
app-id 应用程序的类型和版本号
user-id 标识已登录用户,极少使用
type 消息类型名称,完全由应用决定如何使用该字段
reply-to 构建回复消息的私有响应队列
headers 键/值对表,用户自定义任意的键和值
priority 指定队列中消息的优先级

评论