RabbitMQ做爲最流行的MQ中間件之一,普遍使用在各種系統中,今天咱們就來討論一下如何經過Policies給RabbitMQ中已經建立的Queue添加屬性和參數。html
一般來講,咱們會在建立一個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機制了。code
本文的重點是如何使用Policy,更多關於Policy的意義可參考 Why Policies Exist。htm
Policies是RabbitMQ的Server端機制,不能經過Client來建立,RabbitMQ支持如下幾種方式來建立Policy:中間件
這裏選擇最直觀的 Web UI方式來說,Web UI建立Policy的界面在 Admin Tab頁中的Policies右側導航欄,如圖:
blog
點擊進入後,能夠看到4塊內容,User Policies
、Add / update a policy
、Operator Policies
、Add / update an operator policy
排序
打開Add / update an operator policy
rabbitmq
從界面上能夠很是直觀的看到一個Policy須要的元素:隊列
Definition 可添加的args參考如下文檔:ci
簡單說明一下 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。
在設置Policy時須要注意,由於Policy是根據parttern匹配隊列的,所以可能會出現多個Policy都匹配到某一個隊列的狀況,此時會依據如下規則進行排序選出實際生效的Policy:
priority
排序,值越大的優先級越高;priority
則根據建立時間排序,越晚建立的優先級越高。