全部產品
Search
文件中心

Simple Message Queue (formerly MNS):順序訊息

更新時間:Sep 27, 2025

輕量訊息佇列(原 MNS)支援順序訊息的能力。本文將為您介紹其核心概念、與普通訊息的區別、建立與使用方法、API使用說明,以及相關的限制與最佳實務。

功能定義

輕量訊息佇列(原 MNS)的順序訊息支援為同一分組內的訊息提供先進先出(First-In-First-Out)的能力,從而實現業務情境中訊息的順序處理。

應用情境

順序訊息主要適用於對訊息先後順序有嚴格要求的業務情境:

  • 訂單狀態流轉

    電商訂單系統中,訂單建立→支付→發貨→確認收貨等狀態必須按時間順序處理,確保業務狀態的正確性。

  • 金融交易處理

    證券、股票交易系統中,對於出價相同的交易單,需嚴格按照先出價先交易的原則,下遊處理訂單的系統必須按照出價順序來處理訂單。

  • 資料庫同步

    上遊資料庫執行增刪改操作,將二進位動作記錄作為訊息傳輸到下遊系統,下遊系統按順序還原訊息資料,實現狀態資料按序重新整理,避免資料不一致。

  • 業務日誌記錄

    關鍵業務操作的日誌記錄需要嚴格按照時間順序儲存,便於後續審計和問題排查。

關鍵概念

  • MessageGroupId:訊息分組標識。系統依據分組保證訊息順序:在同一MessageGroupId內,訊息處理嚴格遵循有序原則;而不同分組則可平行處理。

  • 可見度逾時(Visibility Timeout):訊息在成功拉取後,在逾時之前對其他消費者不可見,以免訊息被多個消費者同時處理。如果訊息未被確認刪除,則在逾時後,訊息將重新變為可見。

  • 組鎖定機制:在順序隊列中,同一MessageGroupId的訊息被拉取後,如果一直未被確認刪除(即處於不可見狀態),將會阻塞同一MessageGroupId的後續訊息,以確保嚴格的消費順序。僅在當前訊息被確認刪除或可見度逾時到期後,同一分組的下一條訊息方可被拉取。

與普通訊息的差異

  • 順序語義:

    • 普通訊息(普通隊列/主題):儘力保證至少一次投遞,預設不保證順序。

    • 順序訊息(順序隊列/主題):在同一MessageGroupId內,訊息的消費順序必須嚴格按照到達服務端的時間進行。先到達的訊息應優先處理,後到達的訊息必須在前面訊息處理完成後才能進行消費。

  • 並行存取模型:

    • 普通訊息:無分組限制,強調整體吞吐。

    • 順序訊息:以MessageGroupId為並發單元,組內串列,組間並行。

  • 訊息要求:

    • 順序訊息發送必須指定MessageGroupId(適用於隊列與主題)。

快速開始

順序隊列(FIFO隊列)

  • 建立隊列:

    1. 登入輕量訊息佇列(原 MNS)控制台

    2. 在左側導覽列,選擇队列模型 > 队列列表

    3. 在頂部功能表列,選擇地區。

    4. 队列列表頁面,單擊创建队列

    5. 创建队列面板,队列类型選擇顺序队列,配置其他參數,然後單擊确定

      image

  • 發送訊息:

    • 使用SendMessage,必須攜帶MessageGroupId,建議使用業務主鍵(如訂單號)。

    • 若不攜帶MessageGroupId,將返回錯誤碼FifoMissingMessageGroupId

  • 接收與確認:

    • 使用ReceiveMessage拉取,返回體包含MessageGroupId,處理完成後調用DeleteMessage確認。

順序主題(FIFO主題)

  • 建立主題:

    1. 登入輕量訊息佇列(原 MNS)控制台

    2. 在左側導覽列,選擇主题模型 > 主题列表

    3. 在頂部功能表列,選擇地區。

    4. 主题列表頁面,單擊创建主题

    5. 创建主题面板,主题类型選擇顺序主题,配置其他參數,然後單擊确定

      image

  • 建立訂閱:

    建議訂閱時選擇順序隊列,以確保推送順序,普通主題僅能訂閱普通隊列。具體操作請參見步驟三:建立訂閱

  • 發布訊息:

    • 使用PublishMessage,必須攜帶MessageGroupId

    • 若不攜帶MessageGroupId,將返回錯誤碼FifoMissingMessageGroupId

  • 消費與確認:

    • 在訂閱的順序隊列側使用ReceiveMessage拉取並通過DeleteMessage確認,保持分組內順序處理。

API使用說明

隊列相關API

API 名稱

參數說明

返回說明

CreateQueue-建立隊列

入參QueueType

  • normal(普通隊列)

  • fifo(順序隊列)

建立對應類型的隊列。

GetQueueAttributes-擷取隊列屬性

無特殊參數

返回隊列資訊,包含QueueType 欄位。

ListQueue-列出指定阿里雲帳號下的所有隊列

無特殊參數

返回隊列列表,每個隊列包含QueueType欄位。

主題相關API

API名稱

參數說明

返回說明

CreateTopic-建立主題

入參 TopicType

  • normal(普通主題)

  • fifo(順序主題)

建立對應類型的主題。

GetTopicAttributes-擷取主題的屬性

無特殊參數

返回主題資訊,包含TopicType欄位。

ListTopic-查詢阿里雲帳號下的主題列表

無特殊參數

返回主題列表,每個主題包含TopicType欄位。

訊息收發API

API名稱

參數要求

返回說明

備忘

SendMessage

順序隊列必須攜帶MessageGroupId

標準返回。

用於向隊列發送單條訊息。

BatchSendMessage

順序隊列必須攜帶MessageGroupId

標準返回。

用於向隊列批量發送訊息。

PublishMessage

順序主題必須攜帶MessageGroupId

標準返回。

用於向主題發布訊息。

ReceiveMessage

無特殊參數。

返回體包含MessageGroupId

用於從隊列接收單條訊息。

BatchReceiveMessage

支援numOfMessages 參數。

返回體包含MessageGroupId

可能包含多個分組的訊息,各分組內順序保持不變。

使用限制

  • 目前支援的地區包括華南1(深圳)、華東2(上海)、華東1(杭州),其它地區有對訊息先入先出(FIFO)訪問的需求,請提交工單

  • 必須攜帶分組:向順序隊列/主題發送訊息必須攜帶MessageGroupId

  • 類型匹配:

    • 死信(DLQ):僅支援相同類型的訊息綁定,即順序訊息只能綁定到順序類型的無效信件佇列,而普通訊息則只能綁定到普通類型的無效信件佇列。

    • 訂閱:普通主題只能訂閱普通隊列;建議採用順序主題訂閱順序隊列,以確保訊息的順序。

  • 不支援Peek:順序隊列不支援調用查看訊息的介面(PeekMessage)。

最佳實務

  • 分組設計

    • 使用穩定且均勻分布的MessageGroupId(如訂單號),避免少量熱點分組成為效能瓶頸。

    • 對極端熱點業務,考慮在業務層對分組做細分以提升並發度。

  • 可見度逾時:按實際處理時間長度設定,確保業務在逾時前完成並確認,降低重複投遞機率。

  • 等冪與重試:對消費者實現等冪處理與重試機制,保障端到端一致性。

  • 批量拉取:在保證單條處理時延的前提下,合理增大numOfMessages以提升吞吐。

常見問題

順序如何界定?

同一MessageGroupId內的訊息嚴格按發送順序到達並被處理;不同分組之間可以平行處理。

一定要傳MessageGroupId嗎?

是。順序隊列/主題發送訊息必須傳入MessageGroupId,否則無法保證順序。

與普通隊列/主題如何選擇?

若業務依賴嚴格順序(如同一訂單的狀態流轉),請選擇順序隊列/主題;若更關注總體吞吐與彈性且對順序不敏感,可使用普通隊列/主題。如需開始使用,請在控制台建立順序隊列/順序主題,發送時攜帶MessageGroupId,在消費端讀取該屬性並按需處理與確認。