與 ActiveMQ 5 的差異

架構上的差異

雖然它們的設計目的是執行相同的工作,但內部運作方式卻有所不同。以下是一些在您規劃遷移時需要注意的最顯著的架構差異。

在 ActiveMQ 中,我們有一些不同的 IO 連線層實作,例如 tcp (同步) 和 nio (非阻塞)。在 Artemis 中,IO 層是使用 Netty 這個 nio 框架來實作的。這表示不再需要在不同的實作之間選擇,因為預設會使用非阻塞實作。

每個訊息代理的另一個重要部分是訊息儲存。大多數 ActiveMQ 使用者都熟悉 KahaDB。它包含一個訊息日誌,用於快速依序儲存訊息 (和其他命令封包),以及一個索引,用於在需要時擷取訊息。

Artemis 有它自己的訊息儲存。它只包含附加式的訊息日誌。由於分頁處理方式的差異,不需要訊息索引。我們稍後會詳細討論。重要的是要在此說明,這兩個儲存方式是不可互換的,而且如果需要資料遷移,必須仔細規劃。

我們所說的分頁差異是什麼意思?分頁是指當訊息代理無法將所有傳入的訊息保留在其記憶體中時發生的過程。兩個訊息代理處理這種情況的策略有所不同。ActiveMQ 有游標,基本上是準備分派給消費者的訊息快取。它會嘗試將所有傳入的訊息都保留在那裡。當我們耗盡可用記憶體時,訊息會被添加到儲存中,但快取會停止。當空間再次可用時,訊息代理會從儲存中批量提取訊息,再次填滿快取。因此,我們需要在訊息代理執行期間不時讀取日誌。為了做到這一點,我們需要維護一個日誌索引,以便追蹤訊息在日誌中的位置。

在 Artemis 中,這方面的工作方式不同。整個訊息日誌都保存在記憶體中,訊息直接從其中分派。當我們耗盡記憶體時,訊息會在生產者端分頁 (在它們到達訊息代理之前)。它們以與它們到達時相同的順序儲存在循序分頁檔案中。一旦記憶體被釋放,訊息就會從這些分頁檔案移動到日誌中。使用這種方式進行分頁,只有在訊息代理啟動時才會從檔案日誌中讀取訊息,以便重新建立此日誌的記憶體版本。在這種情況下,日誌僅按順序讀取,這表示無需在日誌中保留訊息索引。

這是 ActiveMQ 5.x 和 Artemis 之間的主要差異之一。提早了解它很重要,因為它會影響許多目的地原則設定,以及我們如何配置訊息代理以正確支援這些場景。

定址差異

另一個很重要的差異是訊息定址和路由的方式。ActiveMQ 最初是一個開源的 JMS 實作,因此在其核心,所有 JMS 概念 (如佇列、主題和持久訂閱) 都被實作為一等公民。它完全基於專案內開發的 OpenWire 通訊協定,甚至 KahaDB 訊息儲存也是以 OpenWire 為中心的。這表示所有其他支援的通訊協定 (如 MQTT 和 AMQP) 在內部都會被轉換為 OpenWire。

Artemis 採用了不同的方法。它在內部僅實作佇列,所有其他訊息傳遞概念都是透過將訊息路由到適當的佇列 (使用位址) 來實現的。訊息傳遞概念 (如發布-訂閱 (主題) 和點對點 (佇列)) 是使用位址上的不同類型的路由機制來實作的。多播路由用於實作發布-訂閱語意,其中特定位址的所有訂閱者都會獲得自己的內部佇列,並且訊息將被路由到所有這些佇列。任播路由用於實作點對點語意,其中位址只有一個佇列,並且所有消費者都會訂閱它。定址和路由方案適用於所有通訊協定。例如,您可以將 JMS 主題視為多播位址。我們將在後續文章中更詳細地介紹這個主題。

個符合 "" 的結果

    沒有符合 "" 的結果