微信紅包系統架構的設計和優化分享

微信紅包系統架構的設計和優化分享

?

編者按:經過2014年一年的醞釀,2015微信紅包總量創下歷史新高,峰值1400萬次/秒,8.1億次每分鐘,微信紅包收發達10.1億次,系統整體運行平穩, 在這里我分享下微信紅包背后的技術。
講師:jeri
核心功能&目標
首先,了解下微信紅包的4個邏輯:搖/發/搶/拆。看似簡單,實現可不簡單再review下微信紅包要實現目標:
搖:搖的流暢
快:搶的要快
爽:拆的爽
穩:能分享出去
系統難點:
1.中國運營商網絡環境復雜,覆蓋面廣,春節期間網絡吃緊,容易出現網絡故障
2.在尖峰搖時如何避免服務雪崩
3.在服務資源有限時,如何提供柔性服務
4.如何構造有損服務
5.如何構造set模型
6.如何解決并發搶
7.如何實現實現數據一致性
系統整體架構圖
跨區域網絡解決方案
微信客戶端分布全球,接入點較多,用戶資料靠近接入點,可以加速用戶資料訪問,但是紅包的業務邏輯層并不全網分布,業務邏輯層訪問數據層比較多,數據層有狀態強一致性問題,只能同用一個數據副本,比如上海用戶與深圳用戶在同個群里,搶同一個紅包,如果訂單數據在上海與深圳都有,在搶的時候,無法保證數據同步,可用性低,所以,設計系統時,一定要梳理清楚系統間的調用關系,優化接入層的業務邏輯,把網絡耗時降到最小,系統吞吐量才能提升。
跨區域網絡問題,在物理實施上,也需要有備份繞行的能力,這個可以在系統的底層框架中實現,當指定專線出現故障時,快速切換網絡,恢復服務
如何構建有損服務
什么是有損服務?選擇性犧牲一部分數據一致性和完整性從而保證核心功能絕大多數運行,經過一段時間窗口,數據一致性與完整性能得以恢復,這也是騰訊的一直運營策略,在有限資源前提下,量力而為,滿足用戶的核心需求
比如,春晚搖一搖,我們的核心點是搖/拆/分享,那系統的資源優先需要保證這些服務的響應,任何關聯系統出現異常的時候馬上進行系統降級,防止引起系統雪崩。
系統降級可以分為兩個方面,一是把核心功能調用鏈路簡化,減少依賴,通過輔助輕量化的服務實現,確保最短關鍵路徑的可行,比方說在接入層置入搖紅包邏輯,將每秒千萬級請求轉化為每秒萬級的紅包請求,再傳到紅包服務的后端邏輯,降低雪崩的可能性。
柔性服務.打造好的產品體驗
柔性可用是在有損服務價值觀支持下的方法,重點在于實際上會結合用戶使用場景,根據資源消耗,調整產品策略,設計幾個級別不同的用戶體驗場景,保證盡可能成功返回關鍵數據,并正常接受請求,絕不輕易倒下。
比如,紅包的核心功能拆,拆完需要記錄用戶頭像昵稱,轉帳資金劃轉,同時輸出同個訂單下其它拆記錄,拆過程這些操作都可能失敗,但是核心操作獲取紅包是成功的,此時,我們至少可以告訴用戶搶到金額,不至于讓用戶焦急等待,不斷重試,未完成的操作(頭像補全與資金轉帳),可以通異步補嘗方式重試。這樣解決了用戶的問題,也緩解了系統壓力。
如果構造set模型
Set模塊就像一個集裝箱,把各模塊標準化,模塊化,規模化,它為海量服務運營,特別是設備管理、網絡架構,提供了宏觀運營支撐框架,從而極大提高了海量服務運營效率。
微信紅包的set模塊,以拆服務為例,從接入層開始,數據開始sticky,按訂單號路由,即按單號分set,同一個set盡可能在一個IDC 里,減少模塊間調用的耗時,在同一個set內,邏輯層任何一臺機器,調用方可實時摘除,如果是數據層發生故障,先在接入層,把新產生的紅包訂單號屏蔽有故障對應的set編號,比如,set1 數據庫出現故障,為了避免在故障的set1 上繼續產生新的支付請求,在訂單生成器直接跳過set1的單號規則,把新請求導致其它set, 只有未搶完的部分紅包,會提示故障,稍后恢復,阻止了故障引發的進一步惡化,在故障db上的數據,通過備機與業務邏輯層的數據核對,完成數據一致性的修復。
如何解決并發搶
群里紅包的規則是金額隨機搶,在一個大群發一個紅包出去,搶并發請求量高,在同一個資源上操作,需要增加鎖操作,避免一個搶總數超過發送紅包總數,眾所周所,mysql的加鎖操作,很多搶在一個鎖上等,性能損耗大,吞吐量下降,對于海量服務的操作,是不能滿足要求。
在set模塊的基礎上,我們把發/搶的資源請求都會落到同一個資源set,在最外層,cache紅包的狀態,如果紅包已經被搶完了,即刻返回,如果紅包未接完,對于一個紅包進去搶環節還有限流,這是第一級保護,通過一致性hash算法,一一個單到dao層都會路由到同一個機器的同一個進程,dao到mysql在現一個連接上完成搶操作,把并發搶修改成串行化,mysql可以無鎖等待,性能明顯提升。
如何實現數據一致性
談到分布式系統,先回顧CAP理論
C:Consistency數據一致更新,所有變動都是同步的
A:高可用,好的響應性能
P: 分區容忍,可靠性
在我們的系統設計中,同樣碰到這個問題,無法同時滿足三個因子,移動互聯網系統,高可用性是必要要求,數據分區也是分布式系統的條件,所以,我們設計系統時,只能盡量保證數據一致性,只要一定時間窗口內,完成數據一致,讓用戶滿意。
微信紅包的數據有幾份,訂單數據,用戶數據,還有對應的cache數據,
N:數據副本份數紅包有三份
R: 一次需讀取的副本紅包一次從一個副本可以全部讀取需要數據
W: 一次寫入數據2份實時寫,一分異步化
R(1) + W(2) <=N從公式算出,我們的數據模型也是弱一致性
用戶數據是異步更新,更新失敗,通過消息中心,異步重試,根據DB資源負載設置調用方的調用閥值,除了實時重試,我們還有準實時數據核對,保證數據最終一致性。
posted on 2018-08-11 19:36 micwin 閱讀(...) 評論(...) ?編輯 收藏

轉載于:https://www.cnblogs.com/chinanetwind/articles/9460820.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jquery各版本下載

jquery-2.1.4 (注&#xff01;jquery-2.0以上版本不再支持IE 6/7/8) 百度引用地址 (推薦目前最穩定的&#xff0c;不會出現延時打不開情況) 百度壓縮版引用地址: <script src"http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> 微軟壓縮版引…

python list方法操作_Python 列表(List)操作方法詳解

參考文獻來源于腳本之家列表是Python中最基本的數據結構&#xff0c;列表是最常用的Python數據類型&#xff0c;列表的數據項不需要具有相同的類型。列表中的每個元素都分配一個數字 - 它的位置&#xff0c;或索引&#xff0c;第一個索引是0&#xff0c;第二個索引是1&#xff…

FastDFS單機版安裝教程

安裝清單如下&#xff1a; 一、安裝FastDFS 1. 安裝libfastcommon 先解壓安裝包到目錄 # unzip libfastcommon-1.0.36.zip 安裝編譯工具及環境&#xff08;后面Nginx也會用到這些依賴環境&#xff09; # yum -y install gcc gcc gcc-c openssl openssl-devel pcre pcre-deve #…

【原創】Chrome最新版(53-55)再次爆出BUG!

2019獨角獸企業重金招聘Python工程師標準>>> 前言 今年十月份&#xff0c;我曾發布一篇文章《Chrome53 最新版驚現無厘頭卡死 BUG&#xff01;》&#xff0c;不過那個BUG在最新的 Chrome 54 中已經修正。 而今天即將發布的Chrome弱智BUG&#xff1a; 僅 Chrome 53 -…

ThinkPHP 發送post請求

function post($url, $paramarray()){ if(!is_array($param)){ throw new Exception("參數必須為array"); } $httph curl_init($url); curl_setopt($httph, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($httph, CURLOPT_SSL_VERIFYHOST, 1); curl_setopt($httph,CURLOP…

vue 打包路由報錯_Vue下路由History模式打包后頁面空白的解決方法

vue的路由在默認的hash模式下,默認打包一般不會有什么問題,不過hash模式由于url會帶有一個#,不美觀,而且在微信分享,授權登錄等都會有一些坑.所以history模式也會有一些應用場景.新手往往會碰到history模式打包后頁面一片空白的情況,而且沒有資源加載錯誤的報錯信息.這個其實仔…

leetcode-回文鏈表

請判斷一個鏈表是否為回文鏈表。 示例 1: 輸入: 1->2 輸出: false 示例 2: 輸入: 1->2->2->1 輸出: true進階&#xff1a;你能否用 O(n) 時間復雜度和 O(1) 空間復雜度解決此題&#xff1f; 思路&#xff1a;先遍歷鏈表&#xff0c;獲得長度。 把前半部分的鏈表逆置…

進程kswapd0與events/0消耗大量CPU的問題

http://www.nowamagic.net/librarys/veda/detail/2539 今天下午網站宕了兩次機&#xff0c;發工單給阿里云&#xff0c;發現原因是服務器的CPU 100%了。 重啟服務器后&#xff0c;使用 top 命令看看是哪些進程消耗那么大的 CPU 使用。盯了有好十幾分鐘&#xff0c;主要消耗 CPU…

索引器

namespace _03{ class Program { //請編寫一個類&#xff1a;ItcastClass,該類中有一個私有字段_names,數據類型為&#xff1a;字符串數組&#xff0c;長度為5&#xff0c;并且有5個默認的姓名。 //要求&#xff1a;為ItcastClass類編寫一個索引器&#xff0c;要求該索引器能夠…

跑三小時的monkey測試該怎么算_淺談App測試(下)~帶音頻

文 | Vicky采編&#xff5c;Emily淺談App測試(上)&#xff5e;帶音頻一、功能測試?二、性能測試(1)耗電量影響因素&#xff1a;定位、傳感器、藍牙&#xff0c;其中CPU、持續定位是兩個平臺造成耗電的主要因素。(2)流量也就是常說的耗流量&#xff0c;影響因素有重復請求&…

Flask基礎(03)--創建第一個Flask程序

# 導入Flask from flask import Flask# 創建Flask的應用程序 # 參數__name__指的是Flask所對應的模塊&#xff0c;其決定靜態文件從哪個地方開始尋找 app Flask(__name__,static_url_path/static, # 靜態文件的訪問路徑&#xff0c;默認為/staticstatic_folderstatic, # 靜態…

2016-2017-2 《Java程序設計》課程學生博客和代碼托管鏈接

2016-2017-2 《Java程序設計》課程學生博客和代碼托管鏈接 博客 1552 20155201 李卓雯20155202 張 旭20155203 杜可欣20155204 王 昊20155205 郝博雅20155206 趙 飛20155207 王雪純20155208 徐子涵20155209 林虹宇20155210 潘瀅昊20155211 解雪瑩20155212 江振思20155213 陸忠民…

C++快速排序

快速排序作為排序家族里面最為快捷的方式&#xff0c;值得思考。我們將一個數組中的某一個數定為基點&#xff0c;然后通過快速排序按照需求&#xff08;假設升序&#xff09;&#xff0c;將比基點小的數丟在基點左邊&#xff0c;把比基點大的數丟在基點右邊這樣來將基點數的正…

回顧一年的工作歷程_【設備管理公司】召開20202021年度總結計劃表彰暨工作述職會議...

點擊上方藍字關注我們2020年即將過去&#xff0c;為了總結2020年各項工作開展情況&#xff0c;同時做好2021年工作計劃與部署&#xff0c;2020年12月30日-31日&#xff0c;設備管理公司組織召開了2020-2021年度總結計劃表彰暨工作述職會議。公司領導、各部門經理、部門主管、車…

注冊驗證的時候一直出現的報錯問題,終于解決了

今天再注冊驗證表單的時候一直報錯&#xff0c;但是什么都沒有改&#xff0c;就報錯了&#xff0c;后面才知道原來是和我上次上傳圖片的時候&#xff0c;導入的2個js的順序有關系的&#xff0c; 45行和41行互相換一下位置就好了 轉載于:https://www.cnblogs.com/likeji/p/61433…

重排序

一、重排序。 1、為什么需要重排序&#xff1f; 現在的CPU一般采用流水線來執行指令。一個指令的執行被分成&#xff1a;取指、譯碼、訪存、執行、寫回、等若干個階段。然后&#xff0c;多條指令可以同時存在于流水線中&#xff0c;同時被執行。 指令流水線并不是串行的&#x…

tableau三軸該怎么做_如何用tableau繪制城市地鐵線路圖?

在用tableau繪制地鐵線路圖之前&#xff0c;當然是要獲取相關的數據啦我們以鄭州目前已開通的地鐵為例&#xff0c;分別是1、2、5號線經度、維度可在 網頁上自行搜索哦&#xff08;以谷歌地圖為準&#xff09;有了這些下面我們就要開始啦將Excel中你所需要的數據直接導入到tabl…

JS七種加密解密方法

HTML或JS加密解密 本文一共介紹了七種方法&#xff1a;   一&#xff1a;最簡單的加密解密   二&#xff1a;轉義字符"\"的妙用   三&#xff1a;使用Microsoft出品的腳本編碼器Script Encoder來進行編碼 &#xff08;自創簡單解碼&#xff09;  …

提高solr的搜索速度

之前是使用12臺機分布式搜索&#xff0c;1臺為主機做索引并分發給子機&#xff0c;8臺做大索引搜索服務&#xff0c;3 臺做小索引搜索服務&#xff0c;配置基本是內存在4-8G&#xff0c;cpu:2-8core的服務器&#xff0c;索引的大小為8G。搜索的響應時間 是150ms左右。&#xff…

哲學到編程:思想的實例化

萬古長江水&#xff0c;千年儒釋道。歷史的長流中&#xff0c;蕓蕓眾生&#xff0c;參差不齊&#xff0c;但總是能夠總結出一個“生旦凈末丑”來。儒、釋、道&#xff0c;五千年的中華文化&#xff0c;卻總是圍繞著這三種主流思想交相演繹。千年間&#xff0c;豪士俊杰&#xf…