輕量訊息佇列(原 MNS)支援順序訊息的能力。本文將為您介紹其核心概念、與普通訊息的區別、建立與使用方法、API使用說明,以及相關的限制與最佳實務。
功能定義
輕量訊息佇列(原 MNS)的順序訊息支援為同一分組內的訊息提供先進先出(First-In-First-Out)的能力,從而實現業務情境中訊息的順序處理。
應用情境
順序訊息主要適用於對訊息先後順序有嚴格要求的業務情境:
訂單狀態流轉
電商訂單系統中,訂單建立→支付→發貨→確認收貨等狀態必須按時間順序處理,確保業務狀態的正確性。
金融交易處理
證券、股票交易系統中,對於出價相同的交易單,需嚴格按照先出價先交易的原則,下遊處理訂單的系統必須按照出價順序來處理訂單。
資料庫同步
上遊資料庫執行增刪改操作,將二進位動作記錄作為訊息傳輸到下遊系統,下遊系統按順序還原訊息資料,實現狀態資料按序重新整理,避免資料不一致。
業務日誌記錄
關鍵業務操作的日誌記錄需要嚴格按照時間順序儲存,便於後續審計和問題排查。
關鍵概念
MessageGroupId:訊息分組標識。系統依據分組保證訊息順序:在同一
MessageGroupId內,訊息處理嚴格遵循有序原則;而不同分組則可平行處理。可見度逾時(Visibility Timeout):訊息在成功拉取後,在逾時之前對其他消費者不可見,以免訊息被多個消費者同時處理。如果訊息未被確認刪除,則在逾時後,訊息將重新變為可見。
組鎖定機制:在順序隊列中,同一
MessageGroupId的訊息被拉取後,如果一直未被確認刪除(即處於不可見狀態),將會阻塞同一MessageGroupId的後續訊息,以確保嚴格的消費順序。僅在當前訊息被確認刪除或可見度逾時到期後,同一分組的下一條訊息方可被拉取。
與普通訊息的差異
順序語義:
普通訊息(普通隊列/主題):儘力保證至少一次投遞,預設不保證順序。
順序訊息(順序隊列/主題):在同一
MessageGroupId內,訊息的消費順序必須嚴格按照到達服務端的時間進行。先到達的訊息應優先處理,後到達的訊息必須在前面訊息處理完成後才能進行消費。
並行存取模型:
普通訊息:無分組限制,強調整體吞吐。
順序訊息:以
MessageGroupId為並發單元,組內串列,組間並行。
訊息要求:
順序訊息發送必須指定
MessageGroupId(適用於隊列與主題)。
快速開始
順序隊列(FIFO隊列)
建立隊列:
在左側導覽列,選擇。
在頂部功能表列,選擇地區。
在队列列表頁面,單擊创建队列。
在创建队列面板,队列类型選擇顺序队列,配置其他參數,然後單擊确定。

發送訊息:
使用
SendMessage,必須攜帶MessageGroupId,建議使用業務主鍵(如訂單號)。若不攜帶
MessageGroupId,將返回錯誤碼FifoMissingMessageGroupId。
接收與確認:
使用
ReceiveMessage拉取,返回體包含MessageGroupId,處理完成後調用DeleteMessage確認。
順序主題(FIFO主題)
建立主題:
在左側導覽列,選擇。
在頂部功能表列,選擇地區。
在主题列表頁面,單擊创建主题。
在创建主题面板,主题类型選擇顺序主题,配置其他參數,然後單擊确定。

建立訂閱:
建議訂閱時選擇順序隊列,以確保推送順序,普通主題僅能訂閱普通隊列。具體操作請參見步驟三:建立訂閱。
發布訊息:
使用
PublishMessage,必須攜帶MessageGroupId。若不攜帶
MessageGroupId,將返回錯誤碼FifoMissingMessageGroupId。
消費與確認:
在訂閱的順序隊列側使用
ReceiveMessage拉取並通過DeleteMessage確認,保持分組內順序處理。
API使用說明
隊列相關API
API 名稱 | 參數說明 | 返回說明 |
CreateQueue-建立隊列 | 入參
| 建立對應類型的隊列。 |
GetQueueAttributes-擷取隊列屬性 | 無特殊參數 | 返回隊列資訊,包含 |
ListQueue-列出指定阿里雲帳號下的所有隊列 | 無特殊參數 | 返回隊列列表,每個隊列包含 |
主題相關API
API名稱 | 參數說明 | 返回說明 |
CreateTopic-建立主題 | 入參
| 建立對應類型的主題。 |
GetTopicAttributes-擷取主題的屬性 | 無特殊參數 | 返回主題資訊,包含 |
ListTopic-查詢阿里雲帳號下的主題列表 | 無特殊參數 | 返回主題列表,每個主題包含 |
訊息收發API
API名稱 | 參數要求 | 返回說明 | 備忘 |
順序隊列必須攜帶 | 標準返回。 | 用於向隊列發送單條訊息。 | |
順序隊列必須攜帶 | 標準返回。 | 用於向隊列批量發送訊息。 | |
順序主題必須攜帶 | 標準返回。 | 用於向主題發布訊息。 | |
無特殊參數。 | 返回體包含 | 用於從隊列接收單條訊息。 | |
支援 | 返回體包含 | 可能包含多個分組的訊息,各分組內順序保持不變。 |
使用限制
目前支援的地區包括華南1(深圳)、華東2(上海)、華東1(杭州),其它地區有對訊息先入先出(FIFO)訪問的需求,請提交工單。
必須攜帶分組:向順序隊列/主題發送訊息必須攜帶
MessageGroupId。類型匹配:
死信(DLQ):僅支援相同類型的訊息綁定,即順序訊息只能綁定到順序類型的無效信件佇列,而普通訊息則只能綁定到普通類型的無效信件佇列。
訂閱:普通主題只能訂閱普通隊列;建議採用順序主題訂閱順序隊列,以確保訊息的順序。
不支援Peek:順序隊列不支援調用查看訊息的介面(PeekMessage)。
最佳實務
分組設計:
使用穩定且均勻分布的
MessageGroupId(如訂單號),避免少量熱點分組成為效能瓶頸。對極端熱點業務,考慮在業務層對分組做細分以提升並發度。
可見度逾時:按實際處理時間長度設定,確保業務在逾時前完成並確認,降低重複投遞機率。
等冪與重試:對消費者實現等冪處理與重試機制,保障端到端一致性。
批量拉取:在保證單條處理時延的前提下,合理增大
numOfMessages以提升吞吐。
常見問題
順序如何界定?
同一MessageGroupId內的訊息嚴格按發送順序到達並被處理;不同分組之間可以平行處理。
一定要傳MessageGroupId嗎?
是。順序隊列/主題發送訊息必須傳入MessageGroupId,否則無法保證順序。
與普通隊列/主題如何選擇?
若業務依賴嚴格順序(如同一訂單的狀態流轉),請選擇順序隊列/主題;若更關注總體吞吐與彈性且對順序不敏感,可使用普通隊列/主題。如需開始使用,請在控制台建立順序隊列/順序主題,發送時攜帶MessageGroupId,在消費端讀取該屬性並按需處理與確認。