rabbitmq的聯邦交換機federation
一、為什么要使用聯邦交互機federation
有些時候,我們的rabbitmq為了容災,會部署到不同的城市。
例如北京部署一台rabbitmq,廣州部署一台rabbitmq。
其中廣州rabbitmq有exchangeA。
當北京的應用要發消息到exchangeA的時候,會因為網絡原因,導致發送時間延時。
federation提供了一個能力,讓北京的rabbitmq接受exchanegA的消息。然后再把exchangeA的消息轉發到廣州的exchangeA。
二、federation的原理
插件會在北京(broker1)上會建立一個同名的交換器exchangeA。
同時建立一個內部的交換器exchangeA broker3
,並通過路由鍵rkA
將這兩個交換器綁定起來。
與此同時 Federation 插件還會在 brokerl 上建立一個隊列federation: exchangeA.broker3
井與交換器exchangeA.broker3
進行綁定。
Federation插件會在隊列federation: exchangeA.broker3
與 broker3中的交換器 exchangeA 之間建立一條 AMQP 連接來實時地消費隊列federation: exchangeA.broker3
中的數據。
這些操作都是內部的,對外部業務客戶端來說這條 Federation link 建立在brokerl exchangeA broker3 exchangeA之間
三、federation的使用
1、在兩台虛擬機上面各安裝1個rabbitmq實例
在機器1執行命令
docker run -d --hostname rabbit1 --net=host --name myrabbit1 rabbitmq:3.6.15-management
在機器3執行命令
docker run -d --hostname rabbit3 --net=host --name myrabbit3 rabbitmq:3.6.15-management
2、開啟federation插件
在機器1執行命令進入容器
docker exec -it myrabbit1 /bin/bash
執行命令開啟插件
rabbitmq-plugins enable rabbitmq_federation_management
在機器3執行命令進入容器
docker exec -it myrabbit3 /bin/bash
執行命令開啟插件
rabbitmq-plugins enable rabbitmq_federation_management
訪問ip:15672可以見到右邊多了2攔
3、在機器3上面新建eujian.queue隊列、eujian.exchange交換機、和他們之間的綁定。
這里使用命令行去新建(可以用管理后台自行新建)
rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"eujian.queue">>}, true, false, [], none).'
rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"eujian.exchange">>}, fanout, true, false, false, []).'
rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"eujian.exchange">>}, <<"*">>, {resource, <<"/">>, queue, <<"eujian.queue">>}, []}).'
4、新增一個rabbitmq_federation
在機器3執行命令
rabbitmqctl set_parameter federation-upstream f1 '{"uri":"amqp://guest:guest@192.168.2.138:5672","ack-mode":"on-confirm"}'
這里的192.168.2.138改成機器1的ip
或者在管理台用頁面新建
5、新增一個policy
這里是匹配以eujian.開頭的交換機
在機器3執行命令
rabbitmqctl set_policy --apply-to exchanges p1 "eujian.*" '{"federation-upstream":"f1"}'
或者通過管理台新建
[圖片上傳中...(image.png-258e5f-1604834983968-0)]
6、效果驗證
這里點擊federation status
進入機器1的rabbitmq管理台
這里對機器1的exchange發送一條消息
然后在機器2的隊列里面收到消息。