虛擬主題

ActiveMQ 5.x 中的虛擬主題(虛擬目的地的特殊化)通常解決兩個不同但相關的問題。讓我們逐一探討。

共享存取 JMS 持久主題訂閱

在 JMS1.1 中,持久訂閱由 clientId 和 subscriptionName 這對組合來識別。clientId 元件在 broker 上的連線中必須是唯一的。這表示訂閱是獨佔的。無法在消費者之間做訊息串流的負載平衡,而且快速故障轉移很困難,因為需要先處理 broker 上現有的連線狀態。使用虛擬主題,每個訂閱的訊息串流都會重新導向到佇列。

在 Artemis 中,有兩個替代方案,新的 JMS 2.0 API 或透過 FQQN 直接存取訂閱佇列。

JMS 2.0 共享訂閱

JMS 2.0 新增了使用新的 API 進行共享訂閱的可能性,而 Artemis 完全支援這些 API。

完整限定佇列名稱 (FQQN)

其次,Artemis 在內部使用每個主題訂閱者一個佇列的模型,並且可以使用其完整限定佇列名稱 (FQQN) 直接存取訂閱佇列。

例如,主題 `VirtualTopic.Orders` 的預設 5.x 消費者目的地,訂閱名稱為 `A`

    ...
    Queue subscriptionQueue = session.createQueue("Consumer.A.VirtualTopic.Orders");
    session.createConsumer(subscriptionQueue);

將被替換為包含位址和佇列的 Artemis FQQN。

    ...
    Queue subscriptionQueue = session.createQueue("VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders");
    session.createConsumer(subscriptionQueue);

這確實需要修改消費者使用的目的地名稱,這不是理想的做法。如果無法修改 OpenWire 客戶端,Artemis 支援 OpenWire 通訊協定處理器上的虛擬主題萬用字元篩選機制,該機制會自動將消費者目的地轉換為對應的 FQQN。格式是以分號「;」分隔的字串對的逗號分隔列表。每一對都識別一個篩選器,以匹配虛擬主題消費者目的地,以及一個整數,指定終止消費者佇列身分的符合路徑的數量。

例如:對於預設的 5.x 虛擬主題消費者前綴 `Consumer.*.`,參數 `virtualTopicConsumerWildcards` 應為:`Consumer.*.>;2`。但是,有一個注意事項,因為此值需要編碼到 xml 設定的 uri 中。任何不安全的 url 字元,在本例中:`> ;`,都需要使用其十六進位碼點表示法進行跳脫;導致值為 `Consumer.*.%3E%3B2`。透過這種方式,消費者目的地 `Consumer.A.VirtualTopic.Orders` 將轉換為 `VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders` 的 FQQN。

broker 網路中的持久主題訂閱者

5.x 中的儲存和轉發網路橋接器會為每個目的地建立持久訂閱者。隨著需求在網路上遷移,重複的持久訂閱會在網路中的每個節點上建立,但它們不會遷移。最終結果可能會導致重複的訊息儲存,並最終導致重複傳遞,這並不好。當持久訂閱者對應到虛擬主題訂閱者佇列時,佇列可以遷移,並且可以避免這個問題。

在 Artemis 中,因為持久訂閱被建模為佇列,所以不會發生這個問題。

個結果符合「

    沒有符合「」的結果