全部產品
Search
文件中心

ApsaraMQ for RocketMQ:順序訊息

更新時間:Jul 01, 2024

順序訊息可以保證訊息的消費順序和發送的順序一致,即先發送的先消費,後發送的後消費,常用於金融證券、電商業務等對訊息指令順序有嚴格要求的情境。本文介紹雲訊息佇列 RocketMQ 版順序訊息的概念、適用情境、實現原理以及使用過程中的注意事項。

什麼是順序訊息

順序訊息是雲訊息佇列 RocketMQ 版提供的一種對訊息發送和消費順序有嚴格要求的訊息。對於一個指定的Topic,訊息嚴格按照先進先出(FIFO)的原則進行訊息發布和消費,即先發布的訊息先消費,後發布的訊息後消費。

順序訊息分為分區順序訊息全域順序訊息

分區順序訊息

對於指定的一個Topic,所有訊息根據Sharding Key進行區塊分區,同一個分區內的訊息按照嚴格的先進先出(FIFO)原則進行發布和消費。同一分區內的訊息保證順序,不同分區之間的訊息順序不做要求。

  • 適用情境

    適用於效能要求高,以Sharding Key作為分區欄位,在同一個區塊中嚴格地按照先進先出(FIFO)原則進行訊息發布和消費的情境。

  • 樣本
    • 使用者註冊需要發送驗證碼,以使用者ID作為Sharding Key,那麼同一個使用者發送的訊息都會按照發布的先後順序來消費。
    • 電商的訂單建立,以訂單ID作為Sharding Key,那麼同一個訂單相關的建立訂單訊息、訂單支付訊息、訂單退款訊息、訂單物流訊息都會按照發布的先後順序來消費。

阿里巴巴集團內部電商系統均使用分區順序訊息,既保證業務的順序,同時又能保證業務的高效能。

全域順序訊息

對於指定的一個Topic,所有訊息按照嚴格的先入先出(FIFO)的順序來發布和消費。

  • 適用情境

    適用於效能要求不高,所有的訊息嚴格按照FIFO原則來發布和消費的情境。

  • 樣本

    在證券處理中,以人民幣兌換美元為Topic,在價格相同的情況下,先出價者優先處理,則可以按照FIFO的方式發布和消費全域順序訊息。

說明 全域順序訊息實際上是一種特殊的分區順序訊息,即Topic中只有一個分區,因此全域順序和分區順序的實現原理相同。因為分區順序訊息有多個分區,所以分區順序訊息比全域順序訊息的並發度和效能更高。

如何?順序訊息

全域順序訊息和分區順序訊息原理一樣,下文以分區順序訊息為例介紹在雲訊息佇列 RocketMQ 版中如何保證訊息收發的順序。順序訊息1.0
雲訊息佇列 RocketMQ 版中,訊息的順序需要由以下三個階段保證:
  • 訊息發送

    如上圖所示,A1、B1、A2、A3、B2、B3是訂單A和訂單B的訊息產生的順序,業務上要求同一訂單的訊息保持順序,例如訂單A的訊息發送和消費都按照A1、A2、A3的順序。如果是普通訊息,訂單A的訊息可能會被輪詢發送到不同的隊列中,不同隊列的訊息將無法保持順序,而順序訊息發送時雲訊息佇列 RocketMQ 版支援將Sharding Key相同(例如同一訂單號)的訊息序路由到一個隊列中。

    雲訊息佇列 RocketMQ 版服務端判定訊息產生的順序性是參照同一生產者發送訊息的時序。不同生產者、不同線程並發產生的訊息,雲訊息佇列 RocketMQ 版服務端無法判定訊息的先後順序。

  • 訊息儲存

    如上圖所示,順序訊息的Topic中,每個邏輯隊列對應一個物理隊列,當訊息按照順序發送到Topic中的邏輯隊列時,每個分區的訊息將按照同樣的順序儲存到對應的物理隊列中。

  • 訊息消費

    雲訊息佇列 RocketMQ 版按照儲存的順序將訊息投遞給Consumer,Consumer收到訊息後也不對訊息順序做任何處理,按照接收到的順序進行消費。

    Consumer消費訊息時,同一Sharding Key的訊息使用單線程消費,保證訊息消費順序和儲存順序一致,最終實現消費順序和發布順序的一致。

注意事項

  • 同一個Group ID只對應一種類型的Topic,即不同時用於順序訊息和無序訊息的收發。
  • 對於全域順序訊息,建議訊息不要有阻塞。同時運行多個執行個體,是為了防止工作執行個體意外退出而導致業務中斷。當工作執行個體退出時,其他執行個體可以立即接手工作,不會導致業務中斷,實際工作的只會有一個執行個體。
  • 雲訊息佇列 RocketMQ 版服務端判定訊息產生的順序性是參照單一生產者、單一線程並發下訊息發送的時序。如果發送方有多個生產者或者有多個線程並發發送訊息,則此時只能以到達雲訊息佇列 RocketMQ 版服務端的時序作為訊息順序的依據,和業務側的發送順序未必一致。

順序訊息常見問題

  • 同一條訊息是否可以既是順序訊息,又是定時訊息和事務訊息?

    不可以。順序訊息、定時訊息、事務訊息是不同的訊息類型,三者是互斥關係,不能疊加在一起使用。

  • 順序訊息支援哪些地區?

    支援雲訊息佇列 RocketMQ 版所有公用雲地區和金融雲地區。

  • 為什麼全域順序訊息效能一般?

    全域順序訊息是嚴格按照FIFO的訊息阻塞原則,即上一條訊息沒有被成功消費,那麼下一條訊息會一直被儲存到Topic隊列中。如果想提高全域順序訊息的TPS,可以升級執行個體配置,同時訊息用戶端應用盡量減少處理本地商務邏輯的耗時。

  • 順序訊息支援哪種訊息發送方式?

    順序訊息只支援可靠同步發送方式,不支援非同步發送方式,否則將無法嚴格保證順序。

  • 順序訊息是否支援叢集消費和廣播消費?

    順序訊息暫時僅支援叢集消費模式,不支援廣播消費模式。

TCP SDK範例程式碼

TCP協議下的範例程式碼請參見以下文檔:

HTTP SDK範例程式碼

HTTP協議下的範例程式碼請參見以下文檔: