拆紅包高併發讀
併發寫網路流量峰值
對賬降級
故障恢復
拆紅包有預拆包和實時拆包2種策略
預拆包的策略在發紅包時將金額m的紅包拆分成n份,將分配好的結果放入記憶體佇列或者cache,通過incr操作在使用者搶紅包時分配預算好的紅包slot,預算的策略可以避免對共享資源的操作,減少了鎖競爭,服務本身是無狀態的,設計和實現相對簡單,伸縮性較好。劣勢是需要額外的儲存空間,如果存在大量活躍紅包或者紅包份數很多時會增加成本。
實時拆包的策略在使用者搶紅包時實時拆包計算金額,這樣只需要儲存剩餘紅包數量和金額,不需要額外儲存每個預拆包的紅包金額。使用預拆包的策略會面臨併發寫的問題,如果多個拆紅包的請求同時執行會導致資料不一致引起超發的問題,可以使用cas操作實現樂觀鎖保證併發拆包不會出現問題。
應對高併發讀的通常思路是業務層攔截過濾無效請求,使用有效的快取。可以使用cache層decr功能記錄請求紅包的使用者數,當decr到0後就攔截後面的請求直接返回,對dao層也要增加相應的快取減少資料庫的壓力。
應對併發寫的通常思路是序列化和樂觀鎖。在使用者搶紅包時實時拆包計算金額,每搶到乙個紅包,就cas更新剩餘金額和紅包個數,同時在db中記錄憑證,考慮到db的寫入壓力,需要做分庫分表,冷熱分離。
大量使用者同時搶紅包是否會造成網路擁塞,發紅包和搶紅包最好在同乙個idc。
考慮到拆紅包憑證和入賬是非同步的2套系統,以及出現故障的可能,需要定時對賬保證資料的一致性。
在cache故障時有限流的使用db進行服務,在資源緊張的時候關閉掉非核心流程,在實時入賬請求量過大時,延遲批量入賬。
reference:
PHP實現微信紅包演算法和微信紅包的架構設計簡介
使用php發紅包,當我們輸入紅包數量和總金額後,php會根據這兩個值進行隨機分配每個金額,保證每個人都能領取到乙個紅包,每個紅包金額不等,就是要求紅包金額要有差異,所有紅包金額總額應該等於總金額。設定總金額為10元,有n個人隨機領取 n 1 第乙個 則紅包金額 x元 n 2 第二個 為保證第二個紅包...
微信紅包系統設計 優化
中小 分享到 qq空間 人人網豆瓣網 開心網更多 0講師 jeri 核心功能 目標 搖 搖的流暢 快 搶的要快 爽 拆的爽 穩 能分享出去 系統難點 1.中國運營商網路環境複雜,覆蓋面廣,春節期間網路吃緊,容易出現網路故障 2.在尖峰搖時如何避免服務雪崩 3.在服務資源有限時,如何提供柔性服務 4....
微信搶紅包演算法實現
只討論金額隨機的情況,需要滿足規則 所有人搶到金額之和要等於紅包總金額1.每個人至少搶到一分錢1.要保證所有人搶到金額的機率相等方案一 每個人點進來領,金額隨機,隨機的上限是當前剩餘的紅包金額。每次搶到的金額 隨機區間 0,剩餘紅包金額 分析 這樣做的缺陷是越早領越有優勢,因為每次搶到的金額 隨機區...