RabbitMQ Policy的使用


RabbitMQ作為最流行的MQ中間件之一,廣泛使用在各類系統中,今天我們就來討論一下如何通過Policies給RabbitMQ中已經創建的Queue添加屬性和參數。

Policise 的作用

通常來說,我們會在創建一個Queue時指定了隊列的各項屬性和參數,例如message-ttlx-dead-letter-exchangex-dead-letter-route-keyx-max-length等,一旦RabbitMQ創建Queue成功,則不允許再修改Queue的任何屬性或參數,除非刪除重建。

我們在實際使用中,隨着業務的變化,經常會出現需要調整message-ttlx-max-length等參數來改變Queue行為的場景,那這個時候怎么辦呢,總不能暫停上下游的生產者和消費者來等Queue的刪除重建吧?這個時候就需要使用到RabbitMQ的Policy機制了。

本文的重點是如何使用Policy,更多關於Policy的意義可參考 Why Policies Exist

Policies 的使用

創建Policy

Policies是RabbitMQ的Server端機制,不能通過Client來創建,RabbitMQ支持以下幾種方式來創建Policy:

  1. rabbitmqctl
  2. Http API
  3. Management Plugin Web UI

這里選擇最直觀的 Web UI方式來講,Web UI創建Policy的界面在 Admin Tab頁中的Policies右側導航欄,如圖: 

點擊進入后,可以看到4塊內容,User PoliciesAdd / update a policyOperator PoliciesAdd / 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 只支持 expiremessage-ttlmax-lengthmax-length-bytes 4個參數。更多信息請參考 Difference From Regular Policies

Policies 之間的優先級

在設置Policy時需要注意,因為Policy是根據parttern匹配隊列的,因此可能會出現多個Policy都匹配到某一個隊列的情況,此時會依據以下規則進行排序選出實際生效的Policy:

  1. 首先根據priority排序,值越大的優先級越高;
  2. 相同priority則根據創建時間排序,越晚創建的優先級越高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM