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
則根據創建時間排序,越晚創建的優先級越高。