一、Fedration外掛介紹
Fedration外掛用來在不同的RabbitMQ叢集之間複製佇列訊息,叢集可以是內網也可以是公網,而這些對應用來說是透明的,即應用不會感知到,也不需要編寫相關程式碼。
設想這樣一個場景:系統有2個RabbitMQ/應用叢集,一個部署在中國,另一個部署在美國,系統有傳送簡訊的功能,出於效能和資料隱私的需要,中國叢集只能給中國的手機號發簡訊,而海外的只能給中國以外的手機號發簡訊,但你們公司有中國、美國的僱員,他們都要登入一個內部系統,其中這個內部系統需要簡訊登入,這樣的場景就可以透過Fedration外掛將相關訊息複製到對方叢集中,由對方叢集來完成相應功能。
二、Fedration相關術語
為了表達準確,我會盡量用英文原文表達相關概念。
1、Upstream(上游)、Downstream(下游)
上面有2個RabbitMQ叢集,A和B,如果我們希望每次發到A的某個Exchange或佇列的資訊也傳送到B,則A是Upstream,B是Upstream,即資料流向是從Upstream流向Downstream的。
不過Rabbit MQ裡操作比較特殊,新增Upstream要在Downstream中加,而不是反過來在Upstream加Downstream。
2、Policy(策略)
即用來控制Fedration如何生效的,一個Fedration涉及到以下因素:
A、Upstream
因為是在Downstream中新增的,所以新增的時候需要指定Upstream的地址
B、應用到Exchange還是Queue(佇列)
Fedration有幾種型別,分別是應用到Exchange和Queue還是全部。
C、其它一些引數
這裡先不介紹
RabbitMQ是用Policy來表達一個Fedration相關引數的,當然Policy還可以用來表達映象佇列控制的,這裡不做介紹。
三、安裝Fedration外掛
首先是安裝Erlang和RabbitMQ,這裡不詳述,注意兩個版本對應上,我開發機上版本如下:
RabbitMQ:3.5.6
Erlang:18.1
啟用外掛:
./sbin/rabbitmq-plugins enable rabbitmq_management ./sbin/rabbitmq-plugins enable rabbitmq_federation./sbin/rabbitmq-plugins enable rabbitmq_federation_management
四、建立Fedration
做實驗之前,先規劃下:
A、Upstream節點
172.21.107.236
B、Downstream節點
172.21.107.77
因為Fedration有分Exchange和Queue的,Queue就簡單了,而Exchange分幾種型別:Topic、Fanout、Direct。
為了方便實驗我們只測試Topic型別的,Exchange和Queue的資訊如下:
Exchange
Type:Topic
Name:oneplus_exchange
Routing Key:sms
Queue:
Name:sms
1、先新增Upstream
登入172.21.107.77後臺:http://172.21.107.77:15672/#
新增介面如下:
Name根據命名規範自己定義,比較重要的引數如下:
URI:常用的格式如下:
amqp://{使用者名稱}:{密碼}@{ip}
以下為例子:
amqp://guest:[email protected]
Prefetch count:和佇列的這個引數一樣,可以取多少條訊息而不回覆,和下面的Acknowledgement Mode配合使用,Acknowledgement Mode一般設為On Confirm,即確認才不重發。
其它引數先預設就OK了。
2、在Downstream上新增policy
注意是在Downstream上新增
還是在Admin標籤上
重要的引數:
Pattern:匹配的正則,遵守左字首匹配原則,如我想針對所有oneplus_exchange開頭的這裡就寫oneplus_exchange
Apply to:應用到Exchange還是Queue還是兩者都應用
我們實驗是針對Exchange,所以只選Exchange。
federation-upstream:要應用到哪個Upstream上
3、在77上新增Exchange和Queue
Exchange
Queue
然後繫結Exchange和Queue:
4、在236上新增Exchange和Queue
新增之後有個灰的Exchange
注意:Exchange不要繫結Queue
Queue也有個灰色的
4、傳送訊息
$client = new Client('172.21.107.236', 5672, 'guest', 'guest');$exchangeName = 'oneplus_exchange';$exchangeType = 'topic';$exchange = new Exchange($client, $exchangeName, $exchangeType);$exchange->setDurable(true);$routingKey = 'sms';$message = new Message("hello" . str_repeat('123456789', 13));$res = $exchange->publish($message, $routingKey);var_dump($res);
執行之後到236(Upstream)上看:
再到77(Donwstream)上看:
五、總結
1、topic型別Exchange
傳送給Upstream:
訊息會複製給Downstream,如果Upstream也綁定了routing key,則Upstream也會儲存1份訊息。
傳送給Downstream:
訊息只在Downstream上有,不會複製到Upstream。
2、direct型別Exchange
傳送給Upstream:
訊息會複製給Downstream,如果Upstream也綁定了Queue,則Upstream也會儲存1份訊息。
傳送給Downstream:
訊息只在Downstream上有,不會複製到Upstream。
3、fanout型別Exchange
傳送給Upstream:
訊息會複製給Downstream,如果Upstream也綁定了Queue,則Upstream也會儲存1份訊息。
傳送給Downstream:
訊息只在Downstream上有,不會複製到Upstream。
即資料流向是單邊的,只能從Upstream複製到Downstream,預設兩邊都會有1份,如果Upstream不想要則可以不繫結Queue。