參考資料:
https://www.rabbitmq.com/federation.html
Federation插件的設計目标是使RbbitMQ 在不同的 Broker 節點之間進行消息傳遞而無須建立叢集,該功能在很多場景下都非常有用:
- Federation插件使RabbitMQ在不同Broker節點間進行消息傳遞而無須建立叢集,在不同管理域(不同的使用者和vhost、不同版本的RabbitMQ Erlang上)中的Broker或叢集間傳遞消息。
- Federation插件基于AMQP 0-9-1協定在不同的Broker之間通信,能容忍不穩定的網絡連接配接情況
- 一個Broker節點中可以同時存在聯邦交換器(或隊列)或者本地交換器(或隊列),隻需對特定交換器(或隊列)建立Federation連接配接(Federation link)
- Federation插件可以讓多個交換器或者多個隊列進行聯邦
- 一個聯邦交換器federated exchange或者一個聯邦隊列federated queue接收上遊upstream的消息,這裡的上遊指的是其他Broker上的交換器或者隊列
- 聯邦交換器能夠将原本發送給上遊交換器的消息路由到本地的某個隊列中;聯邦隊列則允許本地消費者接收來自上遊隊列的消息
1、開啟federation
2、配置federation,添加上遊mq節點
(1)頁面方式:
(2)指令行方式:
rabbitmqctl set_parameter federation-upstream my-upstream \
'{"uri":"amqp://server-name","expires":3600000}'
(3)Http方式:
PUT /api/parameters/federation-upstream/%2f/my-upstream
{"value":{"uri":"amqp://server-name","expires":3600000}}
3、添加政策,正則比對exchange和queue
(1)頁面添加
(2)指令行添加:
rabbitmqctl set_policy --apply-to exchanges federate-me "^amq\." '{"federation-upstream-set":"all"}'
(3)http接口調用添加:
PUT /api/policies/%2f/federate-me
{"pattern":"^amq\.", "definition":{"federation-upstream-set":"all"}, \
"apply-to":"exchanges"}
4、上下遊節點不需要有同樣的virtual host
(1)頁面添加:
(2)指令行添加:
建立虛拟主機: rabbitmqctl add_vhost cloudMsgHost
5 、在下遊節點添加queue和exchange, 會同步到上遊節點
6、上遊往比對的隊列中推送消息,下遊節點會收到消息
以下demo為1個上遊節點和兩個下遊節點
7、驗證上遊節點數
(1)下遊單節點rabbitMQ
腳本中調用接口不停地添加上遊節點,在不比對queue或者exchange的情況下,可以添加1w+上遊節點。在比對5個queue的情況下,添加到3910個上遊節點時mq容器就崩潰了。重新開機容器後,很多接口不響應,無法正常工作。
當上遊數量在1500個左右時,性能還好,可以正常工作。
(2)下遊為兩節點鏡像模式叢集
當不停地增加上遊節點,數量達到1500個左右時,rabbitMQ管理節點出現一段時間的報錯,消息收發出現延遲。一兩個小時後,恢複正常。之後再增加上遊節點時,系統響應緩慢,很難再加上去了。
8、問題及注意事項:
- 密碼中有“@”字元,會導緻添加上遊節點失敗。