首頁>技術>

一、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。

10
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 「學習筆記」深入理解ThreadLocal