MetaQ在雙十二彩票中的運用

雙十二大促是淘寶集市的年終促銷活動,活動當天掃描首頁二維碼贈送一注彩票的活動更是讓大家“玩”了一把。面對瞬間的數倍於往常的峯值,如何讓用戶有一個良好的體驗,如何保證系統的穩定運行,讓我們來揭祕這一切。

歸納一下系統需要做到如下幾點:

  • RT足夠短
  • 壓力分佈均勻
  • 複雜邏輯分離,異步化

系統結構圖

圖1-系統結構圖

大體分爲兩個部分:活動系統,彩票系統,他們之間通過消息驅動。
活動系統裏面只更新一個彩票分配的狀態,數據更新成功就返回給用戶,邏輯足夠簡單能保證RT非常短。彩票系統負責真正的彩票出票和更新用戶狀態等一些耗時操作。
用戶在首頁掃描二維碼發起對活動系統的請求,活動系統更新彩票分配狀態,產生一條消息,立即返回並。彩票系統收到這個消息完成後續出票等一些的業務操作。整個過程是通過MetaQ提供的消息服務驅動完成。活動的時候會有大量的請求涌進活動系統,會產生大量的消息,預估qps達到24w;並且消息不可丟失,確保用戶都能領到一注彩票;活動系統,彩票系統業務複雜度相差較大,處理能力也相差較大,可能會出現大量的堆積;爲了讓用戶有個較好的體驗,消息的消費也需要足夠的及時。綜上對MetaQ有這麼一些挑戰:

  • 高吞吐量
  • 數據可靠
  • 高效堆積
  • 消息投遞足夠低延遲

下面介紹一下MetaQ如何做到這些的。

MetaQ簡介

METAQ是一款完全的隊列模型消息中間件,服務器使用Java語言編寫,可在多種軟硬件平臺上部署。客戶端支持Java、C++編程語言,已於2012年3月對外開源,開源[地址](http://metaq.taobao.org/)。MetaQ的設計目標是高吞吐量,高效堆積。完全的隊列模型還提供了順序消息,消息回溯等一些特性。

metaq_overview

圖2-MetaQ整體結構

基本概念

  • Topic 消息主題
  • Partition 分區,代表一個消費隊列 (一個Topic可以劃分爲多個分區,分區數越多並行度越大,支持的Qps越高)
  • Group 消費分組,代表一個消費集羣

MetaQ對外提供的是一個隊列服務,內部實現也是完全的隊列模型,這裏的隊列是持久化的磁盤隊列,具有非常高的可靠性,並且充分利用了操作系統cache來提高性能。這些特性都源於存儲層的設計。

MetaQ存儲結構

MetaQ的存儲結構是根據阿里大規模互聯網應用需求,完全重新設計的一套存儲結構,使用這套存儲結構可以支持上萬的隊列模型,並且可以支持消息查詢、分佈式事務、定時隊列等功能,如圖3所示。

metaq_store_overview

圖3-MetaQ存儲體系

存儲層可以大致分爲數據文件(CommitLog)和索引文件兩部分。數據文件保存了所有的消息的內容,索引文件保存了消息所在數據文件的偏移量。消息數據不區分Topic,順序的append到CommitLog,索引文件按照Topic-Partition維度組織,不同分區的消息append到不同索引隊列裏面。

消息寫入
客戶端發送一條消息,數據首先會寫到文件緩存中,同時派發一個寫索引請求;異步的構建消息索引。

消息讀取
客戶端讀取消息,根據索引的位置找到需要讀取的消息的物理位置和消息長度,從CommitLog中讀取數據,通過文件緩存來加速消息的讀取。通常熱數據都在緩存中,無需IO操作;非熱數據,會觸發缺頁中斷,數據從磁盤加載到文件緩存中,直接寫到socket緩衝區,避免數據進入Java堆。

數據刷盤
刷盤後數據最終持久化到磁盤。刷盤方式分爲兩種方式:同步刷盤,數據寫入緩存後立即刷盤,確保數據落盤後返回客戶端,MetaQ在同步刷盤過程中也做了一定優化避免過多的性能損失;異步刷盤,數據批量定時的刷到磁盤。

數據清理
消息數據按照文件有效期定時做清理。

數據複製
數據可靠性要求很高的應用,可通過數據複製保證數據的可靠。MetaQ提供兩種數據同步的方式:同步雙寫,數寫入到主機後會同時寫到備機,主備都寫成功才返回客戶端成功,主備間數據無延遲,MetaQ有一套自己的主備間高效數據複製方案;異步複製,數據寫到主機後返回客戶端成功,主備間異步同步,主備間存在一定的延遲。

MetaQ單機上萬隊列

metaq_queue

圖4-MetaQ單機上萬隊列

MetaQ的大部分功能都是靠隊列來驅動,以文件的方式存儲,通過內存映射對數據進行操作。所有的消息都是順序的寫到數據文件(CommitLog),完全順序的寫入,避免隨機IO;消息索引按照Topic和Partition的維度區分串行的寫到索引文件。通過這種這種組織方式可以實現單機上萬隊列,如圖4所示。

數據流圖

數據流圖

圖5-MetaQ數據流圖

消息數據首先寫入到Java堆,然後在寫入到文件緩存,在根據具體的刷盤策略Flush到磁盤;消費消息的時候如果是熱數據則直接從系統緩存寫到socket發到遠端;如果非熱數據則由系統產生缺頁中斷將數據從磁盤加載到系統緩存在寫到socket,數據不進應用程序內存空間。內存的管理,頁面的換入換出都是由OS來管理的。同時消息的拉取也是批量的,一次處理多條數據,儘量減少往返的時間。
MetaQ性能依賴於系統內存分配,磁盤IO的有效利用,所以我們也對操作系統內存分配,髒頁會寫策略,以及IO調度算法做了一些調優,讓資源的分配耗時趨於平穩,堆積的時候保持較高的吞吐量。

負載均衡

發送端負載
默認發送端通過輪詢的方式向broker寫消息,如圖6所示;也可以自行指定消息發到哪裏。

圖6-默認發送端負載

圖6-默認發送端負載

消費端負載
默認是消費集羣機器均分所有的消費隊列。餘下的部分由靠前的消費者消費,如圖7所示。消費端負載均很也可以定製,如同機房優先等。

圖7-默認消費端負載

圖7-默認消費端負載

其他特性

綜上MetaQ主要有以下一些特性:

  •  高吞吐量,低延遲
  • 高效堆積;億級消息堆積能力
  • 完全分佈式;客戶端,服務端都是分佈式的,每個結點的變化都能動態負載
  • 順序消息;能保證消息的嚴格順序
  • 實時消息訂閱
  • 豐富的消息拉取模式
  • 消息過濾
  • 消息內容查詢
  • 消息回溯
  • 事物消息
  • 高可用HA

上文介紹了雙十二彩票系統面臨的挑戰,以及MetaQ如何克服這些難點。如果對其中的實現細節感興趣;或者對其他的一些特性感興趣可以參看MetaQ開源地址:[http://metaq.taobao.org/]。有什麼疑問或者好的建議也歡迎大家給予我們反饋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章