本文主要介紹ApsaraMQ for RabbitMQ的順序消費實現原理,與開源RabbitMQ的不同之處,以及其配置方式和使用限制。
順序消費實現原理
RabbitMQ的順序消費需要“順序儲存”和“單一消費者”兩個條件同時滿足才能實現。
開源 RabbitMQ 實現
單一消費者:開源支援Single Active Consumer模式或Exclusive Consumer模式兩種使用方式,開源社區更推薦Single Active Consumer模式。
順序儲存:開源RabbitMQ的同一個Queue上的訊息讀寫只會集中在一個節點,所以天然支援儲存順序性。
ApsaraMQ for RabbitMQ實現
單一消費者:ApsaraMQ for RabbitMQ支援開源社區推薦的Single Active Consumer模式。
順序儲存:ApsaraMQ for RabbitMQ採用存算分離的分布式架構,同一Queue 的訊息分布在多個節點的多個分區中。但計算節點會從儲存節點讀取這些分區的訊息,進行歸併排序後再返回給消費者,從而實現與開源版本一樣的順序消費語義。
存算分離、分布式架構下的順序消費實現原理
如上圖所示,Single Active Consumer模式的隊列只有一個串連是活躍(Active)的,其它串連都是非活躍的(Inactive)。負責活躍串連的計算節點拉取所有儲存節點上的訊息,將訊息排序後再投遞給消費者。
由於訊息在計算節點中被排序,因此計算節點會臨時持有一部分訊息。當活躍消費者在多個計算節點間漂移時,這部分緩衝訊息將會在稍後重新進入消費隊列。
ApsaraMQ for RabbitMQ優勢
高並發與擴充:ApsaraMQ for RabbitMQ在高並發寫入效能上維持多分區的優勢,同時具備卓越的橫向擴充能力。
高可用性機制:ApsaraMQ for RabbitMQ支援多個消費者與多個計算節點的串連,實現高可用性。當任一消費者或計算節點發生故障時,系統能夠快速切換至其他節點提供服務。
啟用方式
要啟用順序消費,必須將隊列配置為Single Active Consumer模式。在建立隊列時,將參數x-single-active-consumer設定為true 。
啟用該模式後,伺服器會對隊列中的訊息進行排序後再投遞給消費者,這可能導致消費速率降低。因此,請根據具體業務需求謹慎評估是否開啟此功能。
使用限制
僅支援企業版、鉑金版、Serverless版執行個體。