全部產品
Search
文件中心

ApsaraMQ for RabbitMQ:开源RabbitMQ迁移上云

更新時間:Sep 18, 2026

在使用開源RabbitMQ叢集時,當您希望能夠解決各種穩定性痛點(例如訊息堆積、腦裂等問題)、實現高並發、分布式、靈活擴縮容時,您可以將開源RabbitMQ叢集遷移至雲訊息佇列 RabbitMQ 版,本文介紹遷移上雲的前提條件、操作步驟、注意事項等。

遷移前須知

雲訊息佇列 RabbitMQ 版是阿里雲基於專有的分布式訊息儲存技術開發的進階訊息佇列服務。它嚴格遵循AMQP 0-9-1協議,但並不是開源RabbitMQ的簡單託管版本。雲訊息佇列 RabbitMQ 版的架構有效避免了因訊息積壓導致的記憶體流失和伺服器故障等穩定性問題,並成功解決了分布式系統中的腦裂難題。此外,它還提供了高度的延展性和靈活的隨用隨付模式,進一步增強了服務的彈性、降低了成本。

然而,與開源RabbitMQ相比,雲訊息佇列 RabbitMQ 版在某些功能實現上存在差異。因此,在考慮遷移至雲訊息佇列 RabbitMQ 版之前,您需要進行技術能力和成本效益評估,以確保選型符合您的需求。

遷移前評估

技術評估

  • 雲訊息佇列 RabbitMQ 版和開源RabbitMQ在功能、服務和效能、Exchange和Queue等幾個方面存在差異,在遷移至雲訊息佇列 RabbitMQ 版之前,請查看差異項並評估雲訊息佇列 RabbitMQ 版的功能是否符合您的預期。具體差異點,請參見開源對比。

  • 雲訊息佇列 RabbitMQ 版對叢集、介面調用以及字元進行了限制,在使用時不能超過相應的限制值,在遷移之前,請評估限制值是否能滿足您的業務要求。更多資訊,請參見執行個體類型。

  • 建議選擇Serverless系列獨享執行個體,該執行個體支援開源身分識別驗證和許可權,可以實現開源RabbitMQ無縫遷移上雲。

費用評估

雲訊息佇列 RabbitMQ 版提供了預付費系列執行個體和Serverless系列執行個體,涵蓋多種執行個體規格。不同執行個體規格間的差異,請參見執行個體類型。

相比預付費系列執行個體,Serverless系列執行個體具備更好的彈效能力和費用優勢。計費規則,請參見Serverless系列計費說明。

開源RabbitMQ叢集的訊息收發次數、Queue數量及訊息量可通過如下途徑評估。

  • Queue數量:在開源RabbitMQ控制台上的Overview頁面查看Global counts,擷取Queues、Exchanges等各個中繼資料的數量。

  • 訊息收發次數、訊息量:

    • 方法一:在開源RabbitMQ控制台上的Overview頁面查看Message rates,計算Publish、Deliver(manual ack)/Deliver (auto ack)、Redelivered指標的總和。image

    • 方法二:通過Prometheus Grafana大盤查看叢集總的訊息寫入和訊息流程出的QPS和訊息量。

遷移上雲

遷移中繼資料

遷移中繼資料是指將開源RabbitMQ叢集的中繼資料匯出,並將其匯入到阿里雲雲訊息佇列 RabbitMQ 版執行個體。雲訊息佇列 RabbitMQ 版會根據成功匯入的中繼資料在目標雲訊息佇列 RabbitMQ 版執行個體中建立對應的Vhost、Queue、Exchange、Binding,實現RabbitMQ叢集中繼資料遷移上雲。詳細步驟,請參見遷移中繼資料上雲。

建立使用者名稱

開源用戶端訪問雲訊息佇列 RabbitMQ 版服務端時,需要傳入使用者名稱和密碼進行許可權認證,認證通過才允許訪問服務端。雲訊息佇列 RabbitMQ 版支援以下兩種身份許可權管理員模式,詳情請參見使用者和許可權管理。

  • 開源身分識別驗證和許可權管理方式

    支援建立自訂使用者名稱和密碼,同時支援許可權的中繼資料匯入 。

  • 阿里雲存取控制(RAM)

    使用者名稱和密碼可通過阿里雲存取控制(RAM)的AccessKey和AccessKey Secret產生。

打通網路

雲訊息佇列 RabbitMQ 版 提供私網串連存取點,使用私網串連存取點能夠支援雲企業網(CEN)上雲組網,詳情請參見私網串連存取點。

如果選用開源身分識別驗證和許可權管理方式,且已使用私網串連存取點,則跳過此步驟。

遷移訊息資料

遷移方案

以VirtualHost為最小遷移單位,通過串連配置切換、RabbitMQ Shovel外掛程式訊息遷移的方式,實現訊息資料平滑上雲。

方案優勢

  • 平滑遷移業務。

  • 保證資料不丟失。

  • 無需梳理應用間調用的網狀拓撲結構。

方案步驟

請根據業務情境的不同,選擇對應的訊息遷移步驟:

  • 業務不可中斷:

    • 隊列的生產者和消費者整合在同一應用服務中,請參考情境一。

    • 隊列的生產者和消費者分布在獨立的多個應用服務中,請參考情境二。

    • 複雜情境,自建 RabbitMQ 叢集有運行 Shovel 任務,請參考情境三 。

  • 允許停機維護:若業務具備維護視窗,可容忍短時停機,請參考情境四。

情境一:業務不中斷平滑遷移(隊列的生產者和消費者整合在同一應用服務中)
  1. 選擇少量服務節點進行灰階發布,將其 RabbitMQ 用戶端配置切換至雲上執行個體。驗證以下關鍵點:

    1. 生產者能否正常向雲上隊列發送訊息;

    2. 消費者能否正確消費雲上隊列中的訊息;

    3. 業務鏈路端到端功能與效能是否符合預期;

  2. 在確認灰階節點運行正常後,在自建 RabbitMQ 叢集上配置並啟用 Shovel 外掛程式,將指定 VirtualHost 下各隊列中尚未消費的歷史堆積訊息遷移至雲上 RabbitMQ 對應隊列。

  3. 將 RabbitMQ 串連配置全面切換至雲上執行個體,並對所有服務節點執行滾動發布。此時:

    1. 所有新產生的訊息直接寫入雲上隊列;

    2. 所有消費者從雲上隊列消費訊息;

    3. 自建叢集不再接收新訊息,僅作為 Shovel 的源端提供剩餘堆積訊息。

  4. 觀察自建叢集隊列的訊息堆積在減少,當自建叢集隊列沒有堆積後,停止Shovel任務。

  5. VirtualHost下隊列的堆積情況可以在自建RabbitMQ叢集的管控頁面上查看,當隊列的可消費訊息和未確認的訊息數量都為0時,說明已經沒有堆積。

    在 RabbitMQ Management 控制台的 Queues 頁面中,Messages 分組下的 Ready 列對應可消費訊息數,Unacked 列對應未確認訊息數。

    重要

    若代碼中向 x-delayed-message 類型的交換器發送了延遲訊息,則這些訊息在延遲期結束前不會進入隊列,也不會計入隊列堆積量。因此,在停止 Shovel 任務前,需確保等待時間至少覆蓋目前時間加上最大延遲時間長度,以避免遺漏尚未投遞的延遲訊息。

情境二:業務不中斷平滑遷移(隊列的生產者和消費者分布在獨立的多個應用服務中)
  1. 在自建 RabbitMQ 叢集上配置並啟用 Shovel 外掛程式,將目標 VirtualHost 下所有待遷移隊列中的現有堆積訊息遷移到雲上對應隊列;

  2. 啟動雲上 RabbitMQ 執行個體的消費者服務,使其開始從雲上隊列拉取訊息;

  3. 觀察雲上消費者工作正常後,停止自建叢集消費者服務;

  4. 啟動雲上 RabbitMQ 執行個體的生產者服務,驗證新訊息是否成功發布至雲上隊列,並通過消費者端確認端到端鏈路暢通;

  5. 在確認新訊息已穩定流入雲上隊列且被正常消費後,停止自建叢集上的生產者服務;

  6. 此時新訊息直接進入雲上隊列,而 Shovel 會繼續搬運完自建叢集隊列中剩餘的訊息;

  7. 觀察自建叢集隊列的訊息堆積在減少,當自建叢集隊列沒有堆積後,停止Shovel任務。

情境三:業務不中斷平滑遷移(自建 RabbitMQ 叢集有運行 Shovel 任務)
  1. 停止自建叢集生產者服務和消費者服務,並修改服務中的rabbitmq配置,指向雲上RabbitMQ執行個體;

  2. 啟動雲上執行個體生產者服務和消費者服務,觀察生產者和消費者工作正常;

  3. 在自建叢集上配置新的 Shovel 任務(記為 Shovel A),將 VirtualHost A 下所有相關隊列的當前堆積訊息遷移至雲上 RabbitMQ 對應隊列;

  4. 暫停自建叢集中原有的 VirtualHost B到VirtualHost A 的 Shovel 任務(Shovel B),修改 Shovel B 的目標地址,將其直接指向雲上 RabbitMQ 執行個體的對應隊列,重新啟用 Shovel B;

  5. 觀察自建叢集VirtualHost B下隊列的訊息堆積在減少,待沒有堆積後,刪除Shovel B任務;

  6. 觀察自建叢集VirtualHost A下隊列的訊息堆積在減少,待沒有堆積後,刪除Shovel A任務。

情境四:業務停機遷移
  1. 停止自建叢集生產者服務和消費者服務;

  2. 修改服務中的rabbitmq配置,指向雲上RabbitMQ執行個體;

  3. 啟動雲上執行個體生產者和消費者服務,觀察生產者和消費者工作正常;

  4. 在自建 RabbitMQ 叢集上配置並啟用 Shovel 外掛程式,將停機時各隊列中的全部剩餘訊息逐條遷移至雲上對應隊列;

  5. 觀察自建叢集隊列的訊息堆積在減少,當自建叢集隊列沒有堆積後,停止Shovel。

如何使用Shovel

  1. 登入自建叢集,在命令列中執行以下命令為自建RabbitMQ叢集啟動Shovel外掛程式。

    rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
  1. 登入自建RabbitMQ叢集控制台,在頂部功能表列單擊Admin,然後單擊右側的Shovel Management,在Add a new shovel地區設定Source和Destination,單擊Add shovel。

    1. Source配置格式:URI填寫amqp://{username}:{password}@{ip}:{port}/{vhost}。其中,username和password為使用者名稱密碼,ip為自建叢集所在IP地址,port為通訊連接埠,通常為5672,vhost為隊列所在vhost。

    2. Destination配置格式:URI填寫amqp://{username}:{password}@{endpoint}:{port}/{vhost}。其中,username和password為在雲訊息佇列 RabbitMQ 版控制台上建立的靜態使用者名稱密碼,endpoint為雲訊息佇列 RabbitMQ 版的存取點地址,port為5672,vhost為隊列所在vhost。

    表單還需設定 Virtual host、Name(必填)、Source 和 Destination 的協議類型(如 AMQP 0.9.1)及隊列名稱,以及 Prefetch count、Auto-delete(預設 Never)、Add forwarding headers(預設 No)、Reconnect delay 和 Acknowledgement mode(預設 On confirm)等參數。

  2. Shovel添加成功後,在Shovel Status頁面中查看Shovel任務狀態,State顯示為running,說明Shovel任務啟動成功。

  3. 待自建RabbitMQ叢集的隊列裡沒有訊息堆積後,刪除Shovel任務。

    在 Shovel 詳情頁面底部,展開 Delete this shovel 地區,單擊 Delete this shovel 按鈕。

相關文檔

更多關於Shovel外掛程式的資訊,請參見Shovel Plugin。