春晚微信紅包十億級併發壓力是怎麼解決的?

wKiom1fI7XWg2n6bAABmGUcEVaw833.png-wh_50

編者按:

騰訊雲消息服務(Cloud Message Queue)是分佈式消息隊列服務,能夠爲分佈式事務部署的不同應用之間或者一個應用的不同組件之間,提供基於消息的可靠的異步通信機制,消息被存儲在高可靠、高可用的CMQ隊列中,多進程可以同時讀寫,互不干擾。


那麼,究竟什麼是分佈式事務呢?舉一個簡單的例子——春晚微信紅包。


如果A向B發了一個紅包,過程大致如下:

讀取A賬戶餘額;

A賬戶餘額減去紅包金額,並將新的賬戶餘額寫入A賬戶中;

讀取B賬戶餘額;

拆開紅包,讀取紅包金額;

B賬戶餘額加上紅包金額,並將新的賬戶餘額寫入B賬戶中。


對於春晚微信紅包這個達到十億級別的請求來說,如果使用傳統的分佈式事務處理方式,微信紅包這個複雜的過程會放大併發壓力,並且足以導致系統異常。例如上述過程第5步,由於併發壓力過大常會出現A被扣款,B拆開紅包後無法入賬的情況。


騰訊雲消息服務(CMQ)的其中一項功能就是將入賬失敗的請求,轉入到CMQ隊列中,錢包賬戶系統不斷從CMQ隊列拉取數據、嘗試更新操作,直到成功入賬。簡而言之,CMQ保證了入賬消息永不丟失。


在此過程中,CMQ消息隊列保證了紅包消息的可靠存儲、傳遞,實時寫三份保證數據不丟。資金入賬失敗時可多次重試,避免失敗回滾和頻繁輪詢數據庫等傳統方式的弊端。


除了增強分佈式事務處理的可靠性之外,CMQ還有以下幾點功能:

①異步通信協議

消息的發送者將消息發送到消息隊列後可以立即返回,不用等待接收者的響應。消息會被保存在隊列中,直到被接收者取出。消息的發送與處理是完全異步的。


②進程解耦

消息隊列幫助減少兩個進程間的耦合度。只要消息格式不變,即使接收者的接口、位置或者配置改變,也不會給發送者帶來任何改變。並且,消息發送者無需知道消息接收者是誰,使得系統設計更清晰;相反的,進程間使用遠程過程調用(RPC)或者socket連接,當一方接口、ip或端口改變了,另一方則必須修改改寫請求配置。


③消息路由

發送者無需與接收者建立直接連接,雙方通過消息隊列保證消息能夠從發送者路由到接收者,甚至對於本來網絡不易互通的兩個服務,也可以提供消息路由。


④多終端

用戶系統的多個部分可以同時發送或接收消息,騰訊雲 CMQ 通過消息狀態來進行消息可用性的控制。


⑤多樣性

每個隊列均可獨立配置,並非所有隊列都要完全相同。在不同業務場景下的隊列可以進行個性化的配置,例如一個隊列中消息處理時間較長,可以針對隊列屬性進行優化。

wKiom1fI7a-A4X1pAAOYxUuV5v4214.png-wh_50

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