除了等待客戶端連線外,Broker 也可以啟動與其他伺服器的連線。

Broker 連線是透過 broker.xml 設定檔中的 <broker-connections> XML 元素進行設定。

<broker-connections>
  ...
</broker-connections>

1. AMQP 伺服器連線

ActiveMQ Artemis Broker 可以使用 AMQP 協定啟動連線。這表示 Broker 可以連線到另一個 AMQP 伺服器(不一定是 ActiveMQ Artemis),並在該連線上建立元素。

若要定義 AMQP Broker 連線,請在 broker.xml 設定檔的 <broker-connections> 元素內新增一個 <amqp-connection> 元素。例如

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="other-server" retry-interval="100" reconnect-attempts="-1" user="john" password="doe">
    ...
  </amqp-connection>
</broker-connections>
uri

tcp://host:myport[?options](這是必要參數)

name

用於管理目的的連線名稱

user

用於連線至端點的使用者名稱(這是選用參數)

password

用於連線至端點的密碼(這是選用參數)

retry-interval

發生錯誤後,在重新嘗試連線前等待的時間(以毫秒為單位)。預設值為 5000

reconnect-attempts

預設值為 -1,表示無限次嘗試

auto-start

Broker 連線是否應隨著 Broker 自動啟動。預設值為 true。若為 false,則必須呼叫管理操作才能啟動它。

傳輸設定的連線 URI 選項(例如啟用和設定 TLS)與其他 Artemis 連接器 URI 通用。如需更多資訊,請參閱傳輸文件。TLS AMQP Broker 連線的範例設定可在 Broker 範例中的./examples/features/broker-connection/amqp-sending-overssl找到。
如果 Broker 連線已停用自動啟動,則 Broker 連線的啟動只會在 ServerController 上呼叫管理方法 startBrokerConnection(connectionName) 後才會發生。
目標端點需要針對所有設定的操作的權限。因此,如果使用安全性管理員,請確保您使用具有足夠權限的使用者執行已設定的操作。

2. AMQP 伺服器連線操作

AMQP 伺服器連線支援以下類型的操作

  • 鏡像

    • Broker 使用與另一個 Broker 的 AMQP 連線,並複製訊息,然後透過網路傳送確認。

  • 聯邦

    • Broker 聯邦允許本地 Broker 為具有本地需求的位址或佇列建立遠端接收者。相反地,它也可以將聯邦設定傳送到遠端 Broker,導致它在此相同連線上根據位址或佇列的遠端需求在本地 Broker 上建立接收者。

  • 發送者

    • 在特定佇列上接收到的訊息會傳輸到另一個端點。

  • 接收者

    • Broker 從另一個端點提取訊息。

  • 對等節點

    • Broker 在知道如何處理它們的另一個端點上建立發送者和接收者。目前由 Apache Qpid Dispatch 實作。

3. 重新連線和故障轉移

可以決定 Broker 連線上的重新連線方式。

以下是 amqp-connection XML 元素上可用的屬性

reconnect-attempts

預設值為 -1(無限次)。在連線失敗後將嘗試多少次

retry-interval

預設值為 5000,以毫秒為單位,每次重新嘗試連線之間的等待時間

也可以在 Broker 連線上指定備用主機,方法是在 URI 的結尾附加一個以逗號分隔的清單(在 # 之後)。Broker 連線會持續嘗試備用清單,直到其中一個目標可供連線。範例

<broker-connections>
  <amqp-connection uri="tcp://ServerA:5672#BackupA:5672,BackupB:5672" name="ServerA" reconnect-attempts="-1" retry-interval="5000">
    ...
  </amqp-connection>
</broker-connections>

Broker 連線故障轉移 圖 1. Broker 連線 - 重新連線和故障轉移。

先前的範例描述了連線到 ServerA 失敗的情況。系統會嘗試連線到 serverA、backupA 和 backupB,直到成功連線到這些節點之一。

4. 鏡像

鏡像會將來源 Broker 上發生的任何操作重製到目標 Broker。

以下事件會透過鏡像傳送

  • 訊息傳送

    • 傳送到一個 Broker 的訊息將「複製」到目標 Broker。

  • 訊息確認

    • 在一個 Broker 上移除訊息的確認將傳送到目標 Broker。

    • 請注意,如果訊息在目標鏡像上等待消費者,則 ack 將不會成功,而且訊息可能會由兩個 Broker 傳遞。

  • 佇列和位址建立。

  • 佇列和位址刪除。

預設情況下,每個操作都是非同步傳送的,不會封鎖任何客戶端。但是,如果您在鏡像設定上設定 sync=true,則客戶端將始終在每個封鎖操作上等待鏡像。

4.1. 鏡像設定

<amqp-connection> 元素內新增一個 <mirror> 元素,以設定鏡像到目標 Broker。

可以使用以下選用參數

message-acknowledgements

指定是否傳送訊息確認。預設值為 true

queue-creation

指定是否傳送佇列或位址建立事件。預設值為 true

queue-removal

指定是否傳送佇列或位址移除事件。預設值為 true

address-filter

一個選用的以逗號分隔的包含和/或排除篩選器項目清單,用於管理將為此 Broker 連線建立鏡像事件的位址(以及相關的佇列)。也就是說,只有符合篩選器的位址才會將事件鏡像到目標 Broker。當位址以這個欄位中指定的包含項目開始時,就會比對該位址,除非該位址也被另一個項目明確排除。

排除項目會加上 ! 前綴,表示任何以該值開頭的位址都不符合。如果清單中未指定包含項目,則所有未明確排除的位址都會符合。如果未指定 address-filter 屬性,則所有位址(以及相關的佇列)都會符合並進行鏡像。

範例

  • eu 符合所有以 eu 開頭的位址

  • !eu 符合所有位址,但以 eu 開頭的位址除外

  • eu.uk,eu.de 符合所有以 eu.ukeu.de 開頭的位址

  • eu,!eu.uk 符合所有以 eu 開頭的位址,但不符合以 eu.uk 開頭的位址

  • 位址排除將始終優先於位址包含。

  • 鏡像元素上的位址比對是以字首為基礎,不支援萬用字元比對。

sync

如果設定為 true,任何客戶端封鎖操作都會暫停,直到鏡像確認收到操作。預設值為 false

  • 請注意,已中斷連線的節點將暫停來自客戶端的所有操作。如果設定 sync=true,則必須在執行任何操作之前重新連線鏡像。

以下顯示鏡像設定的範例

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="mirror">
    <mirror/>
  </amqp-connection>
</broker-connections>

4.2. 儲存和轉發佇列

鏡像事件始終儲存在本地佇列中,該佇列的前綴為 $ACTIVEMQ_ARTEMIS_MIRROR_,然後與 Broker 連線的設定名稱串連。

因此,在下列設定中,鏡像事件將儲存在名為 $ACTIVEMQ_ARTEMIS_MIRROR_brokerB 的佇列中。

<broker-connection>
  <amqp-connection uri="tcp://brokerB:5672" name="brokerB">
    <mirror/>
  </amqp-connection>
</broker-connection>

然後,這些訊息會傳輸到 brokerB:5672。將針對位址 $ACTIVEMQ_ARTEMIS_MIRROR_brokerB 建立一個生產者到 brokerB。如果已設定安全性管理員,則必須為 Broker 連線上的使用者提供安全性角色。

請注意,佇列 $ACTIVEMQ_ARTEMIS_MIRROR_brokerB 實際上不會存在於 brokerB 上,因此它在管理控制台中將不可見。目標 Broker 將相應地將這些訊息視為鏡像事件,並在目標 Broker 上執行適當的操作。

4.3. 預先存在的訊息

Broker 將只鏡像從設定鏡像的時間點開始到達的訊息。先前存在的訊息將不會轉發到其他 Broker。

5. 雙鏡像(災難復原)

ActiveMQ Artemis 支援自動回溯鏡像。每個傳送的訊息和每個確認都會非同步地複製到鏡像的 Broker。

在下圖中,將有兩個名為 DataCenter1DataCenter2 的伺服器。為了具有雙鏡像設定,必須在每個 broker.xml 上新增鏡像 Broker 連線

Broker 連線 DR 圖 2. Broker 連線 - 災難復原。

DataCenter1 上,應在 broker.xml 上新增以下程式碼

<broker-connections>
   <amqp-connection uri="tcp://DataCenter2:5672" name="DC2">
      <mirror/>
   </amqp-connection>
</broker-connections>

以下 XML 片段應新增至 DataCenter2broker.xml

<broker-connections>
   <amqp-connection uri="tcp://DataCenter1:5672" name="DC1">
      <mirror/>
   </amqp-connection>
</broker-connections>

Broker 連線會將傳送和確認複製到另一個 Broker,無論它們來自何處。如果訊息在 DC1 (DataCenter1) 上傳送,這些訊息將自動傳輸到 DC2 (DataCenter2)。在 DC2 上接收到的訊息確認將自動回傳到 DC1。

該規則的唯一例外情況是,如果任何伺服器上已經有消費者正在等待訊息,則鏡像確認將不會阻止訊息被兩個消費者使用。

建議不要在兩個伺服器上都有作用中的消費者。

5.1. 範例

在 Broker 範例中,有一個範例顯示了雙 Broker 設定(或災難復原),位於 ./examples/features/broker-connection/disaster-recovery

在上面提供的範例中,兩個 Broker 設定為彼此鏡像,並且無論一個 Broker 中發生什麼,都會立即複製到另一個 Broker。

6. 發送者和接收者

透過建立發送者或接收者代理連線元素,可以將 ActiveMQ Artemis 代理連接到另一個 AMQP 端點。

對於發送者,代理會在佇列上建立訊息消費者,將訊息發送到另一個 AMQP 端點。

對於接收者,代理會在位址上建立訊息生產者,從另一個 AMQP 端點接收訊息。

這兩個元素都充當訊息橋樑。但是,處理訊息不需要額外的負擔。發送者和接收者的行為就像 ActiveMQ Artemis 中的任何其他消費者或生產者一樣。

發送者或接收者可以設定特定的佇列。可以使用萬用字元運算式將發送者和接收者比對到特定的位址或位址集合。設定發送者或接收者時,可以設定下列屬性

address-match

使用萬用字元運算式將發送者或接收者比對到特定的位址或集合位址。

queue-name

為特定的佇列設定發送者或接收者。

6.1. 範例

使用位址運算式

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="other-server">
    <sender address-match="queues.#"/>
    <!-- notice the local queues for remotequeues.# need to be created on this broker -->
    <receiver address-match="remotequeues.#"/>
  </amqp-connection>
</broker-connections>

<addresses>
  <address name="remotequeues.A">
    <anycast>
      <queue name="remoteQueueA"/>
    </anycast>
  </address>
  <address name="queues.B">
    <anycast>
      <queue name="localQueueB"/>
    </anycast>
  </address>
</addresses>

使用佇列名稱

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="other-server">
    <receiver queue-name="remoteQueueA"/>
    <sender queue-name="localQueueB"/>
  </amqp-connection>
</broker-connections>

<addresses>
   <address name="remotequeues.A">
     <anycast>
       <queue name="remoteQueueA"/>
     </anycast>
   </address>
   <address name="queues.B">
     <anycast>
       <queue name="localQueueB"/>
     </anycast>
   </address>
</addresses>
接收者只能比對到已存在的本機佇列。因此,如果使用接收者,請確保預先在本機建立佇列。否則,代理無法比對遠端佇列和位址。
請勿為相同的目的地建立發送者和接收者。這會建立無限迴圈的發送和接收。

7. 對等點

代理可以設定為連接到 Apache Qpid Dispatch Router 的對等點,並指示它該代理將作為在路由器上設定的給定 AMQP 路點位址的儲存轉發佇列。在這種情況下,用戶端會連線到路由器,使用路點位址發送和接收訊息,路由器會將這些訊息路由到或從代理上的佇列路由。

對等點設定會導致 ActiveMQ Artemis 為代理連線設定中比對的每個目的地建立發送者和接收者配對,這些配對會攜帶特殊設定,以讓 Qpid Dispatch 知道要與代理協作。這取代了傳統上需要路由器啟動連線和自動連結的需求。

Qpid Dispatch Router 提供許多進階的網路選項,可以與 ActiveMQ Artemis 一起使用。

透過對等點設定,會存在與存在發送者和接收者時相同的屬性。例如,一個配置中,名稱開頭為 queue. 的佇列充當比對的路由器路點位址的儲存,則設定會如下所示

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="router">
    <peer address-match="queues.#"/>
  </amqp-connection>
</broker-connections>

<addresses>
   <address name="queues.A">
     <anycast>
       <queue name="queues.A"/>
     </anycast>
   </address>
   <address name="queues.B">
     <anycast>
       <queue name="queues.B"/>
     </anycast>
   </address>
</addresses>

路由器上必須有一個比對的位址路點設定,指示它將代理附加到的特定路由器位址應視為路點。例如,類似的基於前綴的路由器位址設定會如下所示

address {
    prefix: queue
    waypoint: yes
}

如需更多資訊,請參閱 Apache Qpid Dispatch Router 的「代理訊息傳遞」文件。

請勿使用此功能連線到另一個代理,否則任何傳送的訊息都會立即準備好消費,從而產生無限的發送和接收回音。
不需要使用連接器或自動連結設定路由器以與代理通訊。代理的對等點設定取代了路由器路點用法的這些方面。

8. 位址考量

強烈建議位址名稱佇列名稱相同。當使用具有不同名稱的佇列時 (如下列範例所示),發送者和接收者在建立遠端端點時,將始終使用位址名稱

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="other-server">
    <sender address-match="queues.#"/>
  </amqp-connection>
</broker-connections>
<addresses>
  <address name="queues.A">
    <anycast>
      <queue name="distinctNameQueue.A"/>
    </anycast>
  </address>
</addresses>

上述範例將建立指向 queues.A 的 AMQP 發送者。

為了避免混淆,建議位址名稱佇列名稱保持相同。

9. 聯盟

代理聯盟允許本機代理為具有本機需求的位址或佇列建立遠端接收者。相反地,代理連線可以將聯盟設定傳送到遠端代理,導致它基於此相同連線上位址或佇列的遠端需求,在本機代理上建立接收者。

<amqp-connection> 元素中新增 <federation> 元素,以設定與代理實例的聯盟。 <amqp-connection> 包含驗證和重新連線處理的所有設定。請參閱上述章節以設定這些值。

代理連線聯盟設定由一個或多個原則組成,這些原則定義位址或佇列的本機或遠端聯盟設定。

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="federation-example">
    <federation>
       <local-address-policy name="example-local-address-policy">
         <include address-match="local-address.#" />
         <exclude address-match="local-address.excluded" />
       </local-address-policy>
       <local-queue-policy name="example-local-queue-policy">
         <include address-match="address" queue-match="local-queue" />
       </local-queue-policy>
       <remote-address-policy name="example-remote-address-policy">
         <include address-match="remote-address" />
       </remote-address-policy>
       <remote-queue-policy name="example-remote-queue-policy">
         <include address-match="#" queue-match="remote-queue" />
         <exclude address-match="excluded.#" queue-match="remote-queue-excluded" />
       </remote-queue-policy>
    </federation>
  </amqp-connection>
</broker-connections>

9.1. 本機和遠端位址聯盟

本機或遠端位址聯盟設定本機或遠端代理以監看位址的需求。當存在需求時,它會在另一個代理上比對的位址上建立消費者。由於消費者是在另一個代理上的位址上建立的,因此提供給代理連線的驗證憑證必須具有足夠的權限,才能從另一個代理上的比對位址讀取 (本機位址聯盟) 或寫入 (遠端位址聯盟)。

以下顯示位址聯盟設定的範例。本機和遠端位址原則具有相同的設定參數,只有原則元素名稱不同。

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="federation-example">
    <federation>
       <local-address-policy name="example-local-address-policy"
                             auto-delete="false"
                             auto-delete-delay="1"
                             auto-delete-message-count="12"
                             max-hops="1"
                             enable-divert-bindings="true">
         <include address-match="local-address.#" />
         <exclude address-match="local-address.excluded" />
       </local-address-policy>
    </federation>
  </amqp-connection>
</broker-connections>
name

原則的名稱,這些名稱在代理連線的聯盟原則元素中應是唯一的。

include

用於比對包含的位址的位址比對模式,可以設定多個。如果未設定任何模式,則會比對所有位址。

exclude

用於比對排除的位址的位址比對模式,可以設定多個,如果不需要排除,則可以省略。

max-hops

訊息可以執行以進行聯盟的最大躍點數。預設值為 0,適用於大多數簡單的聯盟部署。但是,在某些拓撲中,可能需要更高的值來防止迴圈。

auto-delete

對於位址聯盟,會在代理上建立持久佇列,從該代理中進行聯盟訊息。將此屬性設定為 true,將佇列標記為在啟動代理斷開連線且符合延遲和訊息計數參數後自動刪除。如果您想自動清除動態建立的佇列,這是一個有用的選項。預設值為 false,表示不會自動刪除佇列。

auto-delete-delay

在啟動代理斷開連線後,建立的佇列可以符合 auto-delete 資格的時間量,以毫秒為單位。當省略選項時,預設值為 0

auto-delete-message-count

在啟動代理斷開連線後,遠端佇列中允許的最大訊息數,佇列才符合自動刪除的資格。預設值為 0

enable-divert-bindings

設定為 true 會啟用轉向繫結,以監聽需求。如果具有位址的轉向繫結符合位址原則的包含位址,則任何符合轉向位址的佇列繫結都會建立需求。預設值為 false

9.2. 本機和遠端佇列聯盟

本機或遠端佇列聯盟設定本機或遠端代理以監看佇列的需求,並且當存在需求時,它會在另一個代理上比對的佇列上建立消費者。由於消費者是在另一個代理上的佇列上建立的,因此提供給代理連線的驗證憑證必須具有足夠的權限,才能從另一個代理上的比對佇列讀取 (本機佇列聯盟) 或寫入 (遠端佇列聯盟)。

以下顯示佇列聯盟設定的範例。本機和遠端佇列原則具有相同的設定參數,只有原則元素名稱不同。

<broker-connections>
  <amqp-connection uri="tcp://HOST:PORT" name="federation-example">
    <federation>
       <local-queue-policy name="example-local-queue-policy">
         <include address-match="#" queue-match="remote-queue" />
         <exclude address-match="excluded.#" queue-match="remote-queue-excluded" />
       </local-queue-policy>
    </federation>
  </amqp-connection>
</broker-connections>
name

原則的名稱。這些名稱在代理連線的聯盟原則元素中應是唯一的。

include

用於比對包含的佇列的佇列比對模式。可以設定多個。如果未設定任何模式,則會比對所有佇列。

exclude

用於比對排除的佇列的佇列比對模式。可以設定多個,如果不需要排除,則可以省略。

priority-adjustment

當建立聯盟消費者時,可以使用此值來確保這些聯盟消費者具有比同一佇列上的其他本機消費者更低的優先順序值。預設值為 -1

include-federated

控制在觀察佇列以了解需求時,是否應計算來自聯盟執行個體的佇列上的消費者,預設情況下,此值為 false 且不計入聯盟消費者。

9.3. 範例

在代理的 範例中的 ./examples/features/broker-connection 目錄下,可以找到在各種情況下使用聯盟功能的許多範例。