RabbitMQ-相关属性
RabbitMQ队列的属性
在之前使用RabbitMQ的时候,如果对其队列不是特别清楚的话,可能在一些操作时会产生一定的疑问,如我们在RabbitMQ的消费者端时,首先创建了一个队列,然后绑定了一个路由键,如下:
上述就是我们之前介绍RabbitMQ的时候,最经常使用的方式,但是假设上述我们发现我们一不小心写错了,该队列应该绑定的路由键是bxs2
,然后我们就将上述代码修改完后,再次重新启动,这时我们就会发现上述代码不仅获取到bxs2
路由键的消息,而且也获取到了bxs1
的消息。
因为上述在创建队列时,其中的参数autoDelete=false
,所以当消费者断开连接时,队列不会被删除,之前绑定的路由键bxs1
仍然有效,所以我们需要进行对其解绑,如下:
或者我们在RabbitMQ的控制台页面将该队列进行手动删除也可,当然我们也是可以将该队列设置为自动删除队列的,如下:
自动删除队列
如果我们将其上述参数autoDelete
置为 true 的话,那么当消费者断开连接时,队列将会被删除。自动删除队列允许的消费者没有限制,也就是说当这个队列上最后一个消费者断开连接才会执行删除。
另外之前有时我们自己没有进行定义其队列进绑定的话,而是直接获取系统的随机队列,该队列缺省就是自动删除的。
1 | //获取临时队列 |
单消费者队列
从上述截图我们发现,在创建队列时,还存在其他参数,这里我们再来看看exclusive
参数,该参数表示该队列是否为单消费者队列。
之前我们介绍过一个队列是可以有多个消费者进行消费的,其消息会轮询发送给所有的消费者,如果我们在创建队列时设定属性exclusive
为 true,即可设置队列为排他性队列,即单消费者队列
其中比较有意思的就是,设置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 | 指定队列中消息的优先级 |