前言
RabbitMQ中的队列和交换器,除了一些必须属性 (eg:durable、exclusive等) 外,还有一些可选的参数。 这些参数的形式都是 x-argument
,可以在队列或者交换器定义的时候通过Map类型的参数指定,这些参数可以赋予队列或者交换器一些其他的特征
通过定义队列或交换器的时候指定具体的参数,这可能在某些情况下是个不错的选择。 但是,这种控制方式有一些缺点:
- 不能灵活的对参数进行增删改查操作
- 一次只能为一个队列或者交换器指定参数,不能一次性为多个队列或交换器设置参数
在这种情况下,RabbitMQ引入了 Policies
介绍 Policies
Policies
的主要的属性:
- name:名称,可以是除基于ASCII的名称以外的任何名称,不建议使用空格
- pattern:正则表达式,匹配队列或者交换器
- definition:定义一系列的键值对,也就是参数,会注入到对应的队列和交换器中
- priority:优先级
Policies
会自动的通过其 pattern
属性匹配到对应的队列或交换器,并且将其 definition
属性定义的参数注入到匹配到的队列或交换器中。 Policies
可以仅仅匹配队列、也可以仅仅匹配交换器,甚至可以两者同时匹配,这要取决于其 apply-to
指定的类型(queues
、exchanges
、all
) ,默认的值是all
。 每个队列或者交换器最多只能匹配有一个 Policies
。 当更新 Policies
中相关的参数时,相关的队列或者交换器也会立即更新,对于比较繁忙的队列可能需要花费一点事时间。 当队列或者交换器每次创建的时候都会进行 Policies
的匹配和使用,不只是当 Policies
创建的时候
创建Policies
使用
rabbitmqctl
创建 Policiesrabbitmqctl set_policy policies_name "^amq\." '{"federation-upstream-set":"all"}' --priority 1 --apply-to exchanges
使用 WEB UI 创建 Policies:Admin > Policies > Add/update a policy
Operator Policies
有时我们可能会希望可以强制控制一个 policies
的某些参数,但同时不影响其他的参数的设置,这个时候就可以同时使用 Operator Policies。 一个队列可以同时匹配一个普通的 policies
和一个 Operator Policies
。 但是并不是每个参数都可以强制设定,Operator Policies
只允许下列参数设置:
expires
:设置队列超时时间message-ttl
:设置消息超时时间max-length
:队列中未分发的最大消息数目max-length-bytes
overflow
如果一个队列同时匹配了一个普通的 policies
和一个 Operator Policies
,并且存在上述几个参数的设置冲突,则会选用两者中较小的那个值,因此,Operator Policies
不是覆盖普通 policies
的对应参数,而是在强制的同时尽量的不影响普通的 policies
定义 Operator Policies
使用
rabbitmqctl
创建rabbitmqctl set_operator_policy transient-queue-ttl "^amq\." '{"expires":1800000}' --priority 1 --apply-to queues
使用 WEB UI 页面创建: admin > Polocies > Add / update an operator policy