微信紅包系統設計 優化

2022-07-15 12:30:15 字數 2004 閱讀 2675

中小

分享到:qq空間

人人網豆瓣網

開心網更多

0講師:jeri

核心功能&目標

搖:搖的流暢

快:搶的要快

爽:拆的爽

穩:能分享出去

系統難點:

1.中國運營商網路環境複雜,覆蓋面廣,春節期間網路吃緊,容易出現網路故障

2.在尖峰搖時如何避免服務雪崩

3.在服務資源有限時,如何提供柔性服務

4.如何構造有損服務

5.如何構造set模型

6.如何解決併發搶

7.如何實現實現資料一致性

系統整體架構圖

跨區域網路解決方案

跨區域網路問題,在物理實施上,也需要有備份繞行的能力,這個可以在系統的底層框架中實現,當指定專線出現故障時,快速切換網路,恢復服務

如何構建有損服務

比如,春晚搖一搖,我們的核心點是搖/拆/分享,那系統的資源優先需要保證這些服務的響應,任何關聯系統出現異常的時候馬上進行系統降級,防止引起系統雪崩。

系統降級可以分為兩個方面,一是把核心功能呼叫鏈路簡化,減少依賴,通過輔助輕量化的服務實現,確保最短關鍵路徑的可行,比方說在接入層置入搖紅包邏輯,將每秒千萬級請求轉化為每秒萬級的紅包請求,再傳到紅包服務的後端邏輯,降低雪崩的可能性。

柔性服務.打造好的產品體驗

柔性可用是在有損服務價值觀支援下的方法,重點在於實際上會結合使用者使用場景,根據資源消耗,調整產品策略,設計幾個級別不同的使用者體驗場景,保證盡可能成功返回關鍵資料,並正常接受請求,絕不輕易倒下。

比如,紅包的核心功能拆,拆完需要記錄使用者頭像暱稱,轉帳資金劃轉,同時輸出同個訂單下其它拆記錄,拆過程這些操作都可能失敗,但是核心操作獲取紅包是成功的,此時,我們至少可以告訴使用者搶到金額,不至於讓使用者焦急等待,不斷重試,未完成的操作(頭像補全與資金轉帳),可以通非同步補嘗方式重試。這樣解決了使用者的問題,也緩解了系統壓力。

如果構造set模型

set模組就像乙個貨櫃,把各模組標準化,模組化,規模化,它為海量服務運營,特別是裝置管理、網路架構,提供了巨集觀運營支撐框架,從而極大提高了海量服務運營效率。

如何解決併發搶

群裡紅包的規則是金額隨機搶,在乙個大**乙個紅包出去,搶併發請求量高,在同乙個資源上操作,需要增加鎖操作,避免乙個搶總數超過傳送紅包總數,眾所周所,mysql的加鎖操作,很多搶在乙個鎖上等,效能損耗大,吞吐量下降,對於海量服務的操作,是不能滿足要求。

在set模組的基礎上,我們把發/搶的資源請求都會落到同乙個資源set,在最外層,cache紅包的狀態,如果紅包已經被搶完了,即刻返回,如果紅包未接完,對於乙個紅包進去搶環節還有限流,這是第一級保護,通過一致性hash演算法,一乙個單到dao層都會路由到同乙個機器的同乙個程序,dao到mysql在現乙個連線上完成搶操作,把併發搶修改成序列化,mysql可以無鎖等待,效能明顯提公升。

如何實現資料一致性

談到分布式系統,先回顧cap理論

c:consistency資料一致更新,所有變動都是同步的

a:高可用,好的響應效能

p: 分割槽容忍,可靠性

在我們的系統設計中,同樣碰到這個問題,無法同時滿足三個因子,移動網際網路系統,高可用性是必要要求,資料分割槽也是分布式系統的條件,所以,我們設計系統時,只能盡量保證資料一致性,只要一定時間視窗內,完成資料一致,讓使用者滿意。

n:資料副本份數紅包有三份

r: 一次需讀取的副本紅包一次從乙個副本可以全部讀取需要資料

w: 一次寫入資料2份實時寫,一分非同步化

r(1) + w(2) <=n從公式算出,我們的資料模型也是弱一致性

使用者資料是非同步更新,更新失敗,通過訊息中心,非同步重試,根據db資源負載設定呼叫方的呼叫閥值,除了實時重試,我們還有準實時資料核對,保證資料最終一致性。

微信紅包的設計實現

拆紅包高併發讀 併發寫網路流量峰值 對賬降級 故障恢復 拆紅包有預拆包和實時拆包2種策略 預拆包的策略在發紅包時將金額m的紅包拆分成n份,將分配好的結果放入記憶體佇列或者cache,通過incr操作在使用者搶紅包時分配預算好的紅包slot,預算的策略可以避免對共享資源的操作,減少了鎖競爭,服務本身是...

微信搶紅包架構設計

實時性 為什麼明明搶到紅包,點開後發現沒有?答 2014年的紅包一點開就知道金額,分兩次操作,先搶到金額,然後再轉賬。2015年的紅包的拆和搶是分離的,需要點兩次,因此會出現搶到紅包了,但點開後告知紅包已經被領完的狀況。進入到第乙個頁面不代表搶到,只表示當時紅包還有。分配 紅包裡的金額怎麼算?為什麼...

微信紅包池以及庫存設計思考

庫存設計 乙個商品主表 100條庫存記錄,每各庫存記錄49個庫存 額外一條保障庫存記錄有100個庫存100個 一共101條庫存記錄 共5000庫存 如何實現下單功能 1 如何實現減庫存 2 如何確保快速獲取到庫存個數大於0的庫存記錄並實現減庫存 3 如何保障5000庫存均被消費 寫請求直接到庫 讀請...