微信後臺團隊開源力作:PhxQueue 分佈式隊列

PhxQueue 是微信開源的一款基於 Paxos 協議實現的高可用、高吞吐和高可靠的分佈式隊列。

授權協議:BSD

開發語言:C/C++

操作系統:跨平臺

開發廠商:騰訊

PhxQueue 是微信開源的一款基於 Paxos 協議實現的高可用、高吞吐和高可靠的分佈式隊列,保證At-Least-Once Delivery,在微信內部廣泛支持微信支付、公眾平臺等多個重要業務。

PhxQueue 目前在微信內部廣泛支持微信支付、公眾平臺等多個重要業務,日均入隊達千億,分鐘入隊峰值達一億。

其設計出發點是高數據可靠性,且不失高可用和高吞吐,同時支持多種常見隊列特性。

微信後臺團隊開源力作:PhxQueue 分佈式隊列

PhxQueue 支持的特性

PhxQueue 支持的特性如下

  • 同步刷盤,入隊數據絕對不丟,自帶內部實時對賬

  • 出入隊嚴格有序

  • 多訂閱

  • 出隊限速

  • 出隊重放

  • 所有模塊均可平行擴展

  • 存儲層批量刷盤、同步,保證高吞吐

  • 存儲層支持同城多中心部署

  • 存儲層自動容災/接入均衡

  • 消費者自動容災/負載均衡

PhxQueue 設計

整體架構

PhxQueue 由下列5個模塊組成。

Store - 隊列存儲

Store 作為隊列存儲,引入了 PhxPaxos 庫,以 Paxos 協議作副本同步。只要多數派節點正常工作及互聯,即可提供線性一致性讀寫服務。

為了提高數據可靠性,同步刷盤作為默認開啟特性,且性能不亞於異步刷盤。

在可用性方面,Store 內有多個獨立的 paxos group,每個 paxos group 僅 master 提供讀寫服務,平時 master 動態均勻分佈在 Store 內各節點,均衡接入壓力,節點出災時自動切換 master 到其它可用節點。

Producer - 生產者

Producer 作為消息生產者,根據 key 決定消息存儲路由。相同 key 的消息默認路由到同一個隊列中,保證出隊順序與入隊順序一致。

Consumer - 消費者

Consumer 作為消費者,以批量拉取的方式從 Store 拉消息,支持多協程方式批量處理消息。

Consumer 以服務框架的形式提供服務,使用者以實現回調的方式,根據不同主題(Topic),不同處理類型(Handler)定義具體的消息處理邏輯。

Scheduler - 消費者管理器(可選擇部署)

Scheduler 的作用是,收集 Consumer 全局負載信息, 對 Consumer 做容災和負載均衡。當使用者沒有這方面的需求時,可以省略部署 Scheduler,此時各 Consumer 根據配置權重決定與隊列的處理關係。

部署 Scheduler 後,Scheduler leader 與所有 Conusmer 維持心跳,在收集 Consumer 的負載信息的同時,反向調整 Consumer 與隊列的處理關係。

當 Scheduler leader 宕機了後,Scheduler 依賴下述分佈式鎖服務選舉出新 leader,不可用期間僅影響 Consumer 的容災和負載均衡,不影響 Consumer 的正常消費。

Lock - 分佈式鎖(可選擇部署)

Lock 是一個分佈式鎖,其接口設計非常通用化,使用者可以選擇將 Lock 獨立部署,提供通用分佈式鎖服務。

Lock 在 PhxQueue 中的作用有如下兩點:

  1. 為 Scheduler 選舉 leader;

  2. 防止多個 Consumer 同時處理一條隊列。

Lock 同樣也是可選擇部署的模塊:

  • 若部署了 Scheduler,就必須部署 Lock 為 Scheduler 選舉出 leader;

  • 否則,若業務對重複消費不敏感,可選擇不部署 Lock。

這裡所指的重複消費場景是:

  • 若省略部署 Scheduler 的話,Consumer 需要通過讀取配置得知可處理的隊列集合;

  • 當隊列有變更(如隊列縮擴容)時,各 Consumer 機器上的配置改變有先有後,這時各 Consumer 在同一時間看到的配置狀態可能不一樣,導致一段時間內兩個 Consumer 都認為自己該消費同一個隊列,造成重複消費。

Lock 的部署可以避免該場景下的重複消費。(注意,即使省略部署 Lock,該場景僅造成重複消費,而不會造成亂序消費)。

相關推薦

推薦中...