您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 > 

04 節點訂閱鏈接怎么用不需(消息隊列之RabbitMQ-分布式部署)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-06-01 03:39:03【】5人已围观

简介來通訊。很明顯無論RabbitMQ部署在海外還是國內,另一方一定得忍受連接上的延遲。因此我們可以在海外和國內各部署一個MQ,這樣一來海外連接海外的MQ,國內連接國內,就不會有連接上的延遲了。但這樣還會

來通訊。

很明顯無論RabbitMQ部署在海外還是國內,另一方一定得忍受連接上的延遲。因此我們可以在海外和國內各部署一個MQ,這樣一來海外連接海外的MQ,國內連接國內,就不會有連接上的延遲了。

但這樣還會有問題,假設某生產者將消息存入海外MQ中的某個隊列 queueB , 在國內的服務想要消費 queueB 消息,消息的流轉及確認必然要忍受較大的網絡延遲 ,內部編碼邏輯也會因這一因素變得更加復雜。

此外,服務可能得維護兩個MQ的配置,比如國內服務在生產消息時得使用國內MQ,消費消息時得監聽海外MQ的隊列,降低了系統的維護性。

可能有人想到可以用集群,但是RabbitMQ的集群對延遲非常敏感,一般部署在局域網內,如果部署在廣域網可能會產生網絡分區等等問題。

這時候,Federation就派上用場了。它被設計成能夠容忍不穩定的網絡連接情況,完全能夠滿足這樣的場景。

那使用Federation之后是怎樣的業務流程呢?

首先我們在海外MQ上定義exchangeA,它通過路由鍵“rkA”綁定著queueA。然后用Federation在exchangeA上建立一條 單向 連接到國內RabbitMQ,Federation則自動會在國內RabbitMQ建立一個exchangeA交換器(默認同名)。

這時候,如果部署在國內的client C在國內MQ上publish了一條消息,這條消息會通過 Federation link 轉發到海外MQ的交換器exchangeA中,最終消息會存入與 exchangeA 綁定的隊列 queueA 中,而client C也能立即得到返回。

實際上,Federation插件還會在國內MQ建立一個內部的交換器:exchangeA→ broker3 B(broker3是集群名),并通過路由鍵 "rkA"將它和國內MQ的exchangeA綁定起來。接下來還會在國內MQ上建立一個內部隊列federation: exchangeA->broker3 B,并與內部exchange綁定。這些操作都是內部的,對客戶端來說是透明的。

值得一提的是,Federation的連接是單向的,如果是在海外MQ的exchangeA上發送消息是不會轉到國內的。

這種在exchange上建立連接進行聯邦的,就叫做 聯邦交換器 。一個聯邦交換器接收上游(upstream)的信息,這里的上游指的是其他的MQ節點。

對比前面舉的例子,國內MQ就是上游,聯邦交換器能夠將原本發送給上游交換器的消息路由到本地的某個隊列中。

有聯邦交換器自然也有聯播隊列,聯邦隊列則允許一個本地消費者接收到來自上游隊列的消息 。

如圖,海外MQ有隊列A,給其設置一條鏈接,Federation則自動會在國內RabbitMQ建立一個隊列A(默認同名)。

當有消費者 Cli買粉絲A連接海外MQ并消費 queueA 中的消息時,如果隊列 queueA中本身有若干消息堆積,那么 ClientA直接消費這些消息,此時海外MQ中的queueA并不會拉取國內中的 queueA 的消息;如果隊列 queueA中沒有消息堆積或者消息被消費完了,那么它會通過 Federation link 拉取上游隊列 queueA 中的消息(如果有消息),然后存儲到本地,之后再被消費者 ClientA進行消費 。

首先開啟Federation 功能:

值得注意的是,當需要在集群中使用 Federation 功能的時候,集群中所有的節點都應該開啟 Federation 插件。

接下來我們要配置兩個東西:upstreams和Policies。

每個 upstream 用于定義與其他 Broker 建立連接的信息。

通用參數如下:

然后定義一個 Policy, 用于匹配交換器:

^exchange 意思是將匹配所有以exchange名字開頭的交換器,為它們在上游創建連接。這樣就創建了一個 Federation link。

Shovel是RabbitMQ的一個插件, 能夠可靠、持續地從一個Broker 中的隊列(作為源端,即source )拉取數據并轉發至另一個Broker 中的交換器(作為目的端,即destination )。作為源端的隊列和作為目的端的交換器可以同時位于同一個 Broker 上,也可以位于不同的 Broker 上。

使用Shovel有以下優勢:

使用Shovel時,通常源為隊列,目的為交換器:

但是,也可以源為隊列,目的為隊列。實際也是由交換器轉發,只不過這個交換器是默認交換器。配置交換器做為源也是可行的。實際上會在源端自動新建一個隊列,消息先存在這個隊列,再被Shovel移走。

使用Shovel插件命令:

Shovel 既可以部署在源端,也可以部署在目的端。有兩種方式可以部署 Shovel:

其主要差異如下:

來看一個使用Shovel治理消息堆積的案例。

當某個隊列中的消息堆積嚴重時,比如超過某個設定的閾值,就可以通過 Shovel 將隊列中的消息移交給另一個集群。

很赞哦!(569)

Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款的名片

职业:程序员,设计师

现居:江苏泰州高港区

工作室:小组

Email:[email protected]