橋接器的功能是從來源佇列消費訊息,並將它們轉發到目標位址,通常是在不同的 Apache ActiveMQ Artemis 伺服器上。

來源和目標伺服器不必在同一個叢集中,這使得橋接適用於可靠地將訊息從一個叢集發送到另一個叢集,例如跨 WAN 或網際網路,並且連接可能不可靠的情況。

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

總而言之,橋接器是一種可靠地連接兩個獨立的 Apache ActiveMQ Artemis 伺服器的方法。使用核心橋接器時,來源和目標伺服器都必須是 Apache ActiveMQ Artemis 伺服器。

即使在來源或目標伺服器發生故障時,也可以設定橋接器提供僅傳送一次的傳遞保證。它們透過使用重複偵測(在重複訊息偵測中說明)來做到這一點。

儘管它們具有相似的功能,但不要將核心橋接器與 JMS 橋接器混淆!

核心橋接器用於將 Apache ActiveMQ Artemis 節點與另一個 Apache ActiveMQ Artemis 節點連結,並且不使用 JMS API。JMS 橋接器用於連結任何兩個符合 JMS 1.1 標準的 JMS 提供者。因此,JMS 橋接器可以用於橋接至或來自不同的符合 JMS 標準的訊息傳遞系統。如果可以的話,最好始終使用核心橋接器。核心橋接器使用重複偵測來提供僅傳送一次的保證。若要使用 JMS 橋接器提供相同的保證,則必須使用 XA,這具有較高的開銷並且設定更複雜。

1. 設定核心橋接器

橋接器在 broker.xml 中設定。讓我們從一個範例開始

<bridge name="my-bridge">
   <queue-name>sausage-factory</queue-name>
   <forwarding-address>mincing-machine</forwarding-address>
   <ha>true</ha>
   <filter string="name='aardvark'"/>
   <transformer-class-name>
      org.apache.activemq.artemis.jms.example.HatColourChangeTransformer
   </transformer-class-name>
   <min-large-message-size>102400</min-large-message-size>
   <check-period>30000</check-period>
   <connection-ttl>60000</connection-ttl>
   <retry-interval>2000</retry-interval>
   <retry-interval-multiplier>1.0</retry-interval-multiplier>
   <max-retry-interval>2000</max-retry-interval>
   <initial-connect-attempts>-1</initial-connect-attempts>
   <reconnect-attempts>-1</reconnect-attempts>
   <use-duplicate-detection>true</use-duplicate-detection>
   <confirmation-window-size>10000000</confirmation-window-size>
   <producer-window-size>1048576</producer-window-size>
   <user>foouser</user>
   <password>foopassword</password>
   <reconnect-attempts-same-node>10</reconnect-attempts-same-node>
   <routing-type>PASS</routing-type>
   <concurrency>1</concurrency>
   <static-connectors>
      <connector-ref>remote-connector</connector-ref>
   </static-connectors>
   <!-- alternative to static-connectors
   <discovery-group-ref discovery-group-name="bridge-discovery-group"/>
   -->
   <client-id>myClientID</client-id>
</bridge>

在上面的範例中,我們展示了所有可以為橋接器設定的參數。實際上,您可以使用許多預設值,因此不必明確指定所有參數。

讓我們依次查看所有參數

name

所有橋接器在伺服器中都必須具有唯一的名稱。

queue-name

這是橋接器從中消費的本地佇列的唯一名稱,它是必填參數。

佇列必須在啟動時橋接器被實例化時就已存在。

forwarding-address

這是目標伺服器上訊息將轉發到的位址。如果未指定轉發位址,則將保留訊息的原始位址。

ha

此選用參數決定此橋接器是否應支援高可用性。True 表示它將連線到叢集中的任何可用伺服器並支援容錯移轉。預設值為 false

filter-string

可以提供選用的篩選字串。如果指定,則只會轉發符合篩選字串中指定之篩選運算式的訊息。篩選字串遵循篩選運算式中描述的 ActiveMQ Artemis 篩選運算式語法。

transformer-class-name

可以指定選用的轉換器。這讓您有機會在轉發訊息之前轉換訊息的標頭或內文。有關轉換器特定設定的更多詳細資訊,請參閱轉換器章節

min-large-message-size

任何大於此大小(以位元組為單位)的訊息都被視為大型訊息(以區塊傳送)。支援位元組表示法,如 "K"、"MB"、"MiB"、"GB" 等。預設值為 102400 (即 100KiB)。

check-period

設定用於檢查橋接器用戶端是否未能從伺服器接收到 ping 的時間間隔(以毫秒為單位)。使用 -1 來停用此檢查。預設值為 30000

connection-ttl

在沒有任何資料從橋接器傳入的情況下,遠端伺服器將保持連線的時間長度(以毫秒為單位)。這應該大於 check-period。預設值為 60000

retry-interval

此選用參數決定如果連線到目標伺服器失敗,則後續重新連線嘗試之間的時間間隔(以毫秒為單位)。預設值為 2000 毫秒。

retry-interval-multiplier

此選用參數決定一個乘數,該乘數將套用至自上次重試以來經過的時間,以計算下一次重試的時間。

這讓您可以在重試嘗試之間實作指數退避

讓我們來看一個範例

如果我們將 retry-interval 設定為 1000 毫秒,並將 retry-interval-multiplier 設定為 2.0,那麼如果第一次重新連線嘗試失敗,我們將在後續重新連線嘗試之間等待 1000 毫秒,然後 2000 毫秒,然後 4000 毫秒。

預設值為 1.0,表示每次重新連線嘗試都間隔相同的時間。

max-retry-interval

這會強制限制 retry-interval,因為它可能會因 retry-interval-multiplier 而增長。預設值為 2000

initial-connect-attempts

此選用參數決定橋接器在放棄並關閉之前將進行的初始連線嘗試總數。值為 -1 表示嘗試次數不受限制。預設值為 -1

reconnect-attempts

此選用參數決定橋接器在放棄並關閉之前將進行的重新連線嘗試總數。值為 -1 表示嘗試次數不受限制。預設值為 -1

use-duplicate-detection

此選用參數決定橋接器是否會自動將重複 ID 屬性插入它轉發的每個訊息中。

這樣做可以讓目標伺服器對從來源伺服器接收到的訊息執行重複偵測。如果連線失敗或伺服器崩潰,則當橋接器恢復時,它會重新傳送未確認的訊息。這可能會導致重複的訊息被傳送到目標伺服器。啟用重複偵測可以讓這些重複項目被篩選掉並忽略。

這讓橋接器可以在不使用 XA 等重量級方法的情況下提供僅傳送一次的傳遞保證(有關更多資訊,請參閱重複偵測)。

此參數的預設值為 true

confirmation-window-size

此選用參數決定用於將訊息轉發到目標節點的連線所使用的 confirmation-window-size。支援位元組表示法,如 "K"、"MB"、"MiB"、"GB" 等。此屬性在用戶端容錯移轉屬性一節中說明

當使用橋接器將訊息轉發到使用 BLOCK address-full-policy 的位址(來自設定了 max-size-bytes 的佇列)時,重要的是 confirmation-window-size 小於或等於 max-size-bytes,以防止訊息流停止。

producer-window-size

此選用參數決定透過橋接器的生產者流量控制。使用 -1 來停用。支援位元組表示法,如 "K"、"MB"、"MiB"、"GB" 等。預設值為 1048576 (即 1MiB)。

user

此選用參數決定在建立到遠端伺服器的橋接器連線時要使用的使用者名稱。如果未指定,將使用 broker.xmlcluster-user 指定的預設叢集使用者。

password

此選用參數決定在建立到遠端伺服器的橋接器連線時要使用的密碼。如果未指定,將使用 broker.xmlcluster-password 指定的預設叢集密碼。

reconnect-attempts-same-node

這會設定在返回到初始連接器之前,對拓撲上同一節點進行重新連線嘗試的次數。預設值為 10

routing-type

橋接器可以將特定的路由類型套用至它轉發的訊息、移除現有的路由類型,或只是傳遞現有的路由類型。這在訊息可能已設定其路由類型,但您想要使用不同的路由類型將其橋接至某個位址的情況下非常有用。重要的是要記住,具有 anycast 路由類型的訊息實際上不會路由到使用 multicast 的佇列,反之亦然。透過設定橋接器的 routing-type,您可以靈活地處理任何情況。有效值為 ANYCASTMULTICASTPASSSTRIP。預設值為 PASS

concurrency

對於橋接高延遲網路,尤其是針對具有高輸送量的目的地,可能必須將更多工作者指派給橋接器。這是透過 concurrency 參數完成的。增加並行性將會反映在橋接目的地上顯示的更多消費者和生產者,從而允許在高延遲網路上增加平行處理。預設值為 1

當使用大於 1 的 concurrency 值時,將建立多個橋接器,並以索引命名。例如,如果名為 myBridge 的橋接器配置了 concurrency3,則實際上將建立 3 個橋接器,分別命名為 myBridge-0myBridge-1myBridge-2。重要的是要注意管理操作,因為每個橋接器都會有其自己的相關 BridgeControl

static-connectors

選擇此項或 discovery-group-ref 將橋接器連線到目標伺服器。

static-connectors 是指向其他位置定義的 connector 元素的 connector-ref 元素的列表。連接器封裝了關於要使用的傳輸方式(TCP、SSL、HTTP 等)以及伺服器連線參數(主機、連接埠等)的知識。有關連接器是什麼以及如何設定它們的更多資訊,請參閱設定傳輸

discovery-group-ref

選擇此項或 static-connector 將橋接器連線到目標伺服器。

discovery-group-ref 元素具有一個屬性 - discovery-group-name。此屬性指向其他位置定義的 discovery-group。有關探索群組是什麼以及如何設定它們的更多資訊,請參閱探索群組

client-id

用於橋接器連線的選用識別碼。這有助於在遠端代理程式上識別連線(例如透過 Web 主控台)。預設值為空 (即未設定)。