聯合允許在訊息代理器之間傳輸訊息,而無需叢集。

聯合位址可以將從上游位址發布的訊息複製到本機位址。注意:這僅支援多播位址。

聯合佇列讓本機消費者可以接收來自上游佇列的訊息。

一個訊息代理器可以包含聯合和僅限本機的組件 - 如果您不想,您不需要聯合所有內容。

1. 優點

1.1. 廣域網路 (WAN)

來源和目標伺服器不必在同一個叢集中,這使得聯合適合於將訊息從一個叢集可靠地發送到另一個叢集,例如跨越廣域網路、雲端區域之間或連接可能不可靠的情況。

聯合具有內建的故障恢復能力,因此如果目標伺服器連線遺失,例如由於網路故障,聯合將重試連線到目標,直到它恢復上線。當它恢復上線時,它將恢復正常運作。

1.2. 訊息代理器的鬆散耦合

聯合可以在不同管理網域中的訊息代理器(或叢集)之間傳輸訊息

  • 它們可能具有不同的設定、使用者和設置;

  • 它們可能在不同版本的 ActiveMQ Artemis 上運行

1.3. 動態與選擇性

聯合是透過策略應用的,這些策略會比對位址和佇列名稱,然後應用。

這意味著聯合可以隨著佇列或位址的添加和刪除而動態應用,無需個別設定它們。

同樣地,策略是選擇性的。它們會應用多個包含和排除比對。

多個策略可以直接應用到多個上游。策略可以分組到策略集中,然後應用到上游,以方便管理。

2. 位址聯合

位址聯合類似於跨已連線訊息代理器的完整多播。發送到 Broker-A 上位址的每個訊息都將傳遞到該訊息代理器上的每個佇列,但也會傳遞到 Broker-B 及其所有附加佇列。

位址聯合

Address Federation

有關更多詳細資訊,請參閱位址聯合

3. 佇列聯合

聯合佇列充當在多台機器上具有多個接收器的單一邏輯佇列。它們可用於負載平衡。如果訊息代理器位於相同的可用區域中,您應該考慮將它們叢集化。佇列聯合的優點是它不需要叢集,因此適用於廣域網路、跨區域或內部/外部部署使用。

佇列聯合

Queue Federation

有關更多詳細資訊,請參閱佇列聯合

4. 廣域網路全網狀

也可以提供訊息代理器的廣域網路網狀結構,它可以

  • 透過位址聯合進行複製

  • 使用佇列聯合進行路由和負載平衡

  • 連結遠端的生產者和消費者

可能的完整聯合網狀結構範例

WAN Full Mesh

5. 設定聯合

broker.xml 中的設定範例

<federations>
    <federation name="eu-north-1-federation">
        <upstream name="eu-west-1" user="westuser" password="32a10275cf4ab4e9">
           <static-connectors>
              <connector-ref>connector1</connector-ref>
           </static-connectors>
           <policy ref="policySetA"/>
        </upstream>
        <upstream name="eu-east-1" user="eastuser" password="32a10275cf4ab4e9">
           <discovery-group-ref discovery-group-name="ue-west-dg"/>
           <policy ref="policySetA"/>
        </upstream>

        <policy-set name="policySetA">
           <policy ref="address-federation" />
           <policy ref="queue-federation" />
        </policy-set>

        <queue-policy name="queue-federation" >
           <exclude queue-match="federated_queue" address-match="#" />
        </queue-policy>

        <address-policy name="address-federation" >
           <include address-match="federated_address" />
        </address-policy>
    </federation>
</federations>

在上面的範例中,我們展示了為多個上游設定佇列和位址聯合所需的基本關鍵參數。

此範例顯示訊息代理器 eu-north-1 連接到兩個上游訊息代理器 eu-east-1eu-west-1。將佇列聯合應用到佇列 federated_queue,並將位址聯合應用到位址 federated_address

重要的是,聯合名稱必須是全域唯一的。

您可以應用許多設定選項。這些在個別文件中詳細說明

可以使用來自連接器引用 URI 的額外參數來覆寫或為 ServiceLocator 提供其他設定。

5.1. 大型訊息

如果聯合必須處理大型訊息,則需要變更消費者的預設 ackBatchSizeconsumerWindowSize,以限制傳輸中的訊息數量並啟用大型訊息流。這些選項可以作為所引用連接器 URI 上的參數提供,例如

tcp://<host>:<port>?ackBatchSize=100&consumerWindowSize=-1