RabbitMQ作为最流行的MQ中间件之一,广泛使用在各类系统中,今天我们就来讨论一下如何通过Policies给RabbitMQ中已经创建的Queue添加属性和参数。
Policise 的作用
通常来说,我们会在创建一个Queue时指定了队列的各项属性和参数,例如message-ttl
、x-dead-letter-exchange
、x-dead-letter-route-key
、x-max-length
等,一旦RabbitMQ创建Queue成功,则不允许再修改Queue的任何属性或参数,除非删除重建。
我们在实际使用中,随着业务的变化,经常会出现需要调整message-ttl
、x-max-length
等参数来改变Queue行为的场景,那这个时候怎么办呢,总不能暂停上下游的生产者和消费者来等Queue的删除重建吧?这个时候就需要使用到RabbitMQ的Policy机制了。
本文的重点是如何使用Policy,更多关于Policy的意义可参考 Why Policies Exist。
Policies 的使用
创建Policy
Policies是RabbitMQ的Server端机制,不能通过Client来创建,RabbitMQ支持以下几种方式来创建Policy:
- rabbitmqctl
- Http API
- Management Plugin Web UI
这里选择最直观的 Web UI方式来讲,Web UI创建Policy的界面在 Admin Tab页中的Policies右侧导航栏,如图:
点击进入后,可以看到4块内容,User Policies
、Add / update a policy
、Operator Policies
、Add / update an operator policy
打开Add / update an operator policy
从界面上可以非常直观的看到一个Policy需要的元素:
- Virtual host
- Name: 这个Policy的名称
- Pattern: Policy根据正则表达式去匹配Queues/Exchanges名称
- Apply to: 这个Policy对Queue还是对Exchange生效,或者两者都适用
- Priority: 优先级。
- Definition: 添加的args,KV键值对。
Definition 可添加的args参考以下文档:
Operator Policy
简单说明一下 Operator Policy 和 User Policy 的区别:
- Operator Policy 是给服务提供商或公司基础设施部门用来设置某些需要强制执行的通用规则
- User Policy 是给业务应用用来设置的规则
Operator Policy 和 User Policy 会合并后作用于队列,并且为防止 Operator Policy 对队列某些关键属性例如死信队列交换器Dead Letter Exchange
的覆盖导致业务应用产生非预期的结果,Operator Policy 只支持 expire
、message-ttl
、max-length
、max-length-bytes
4个参数。更多信息请参考 Difference From Regular Policies。
Policies 之间的优先级
在设置Policy时需要注意,因为Policy是根据parttern匹配队列的,因此可能会出现多个Policy都匹配到某一个队列的情况,此时会依据以下规则进行排序选出实际生效的Policy:
- 首先根据
priority
排序,值越大的优先级越高; - 相同
priority
则根据创建时间排序,越晚创建的优先级越高。