東大跨年紅包記--并發(fā)案例分析

2016年12月31日晚,東南大學(xué)在九龍湖體育館舉辦跨年演唱會(huì)。演唱會(huì)期間送出了3000個(gè)現(xiàn)金紅包,同時(shí)搶紅包的人數(shù)在4000人左右。搶紅包的流程和編碼主要由我負(fù)責(zé)實(shí)現(xiàn)。在這樣一個(gè)并發(fā)環(huán)境下,雖然所有的紅包都送了出去,但是也暴露出一些問(wèn)題。就實(shí)際情況和出現(xiàn)的問(wèn)題,做個(gè)分析與總結(jié)。一是記錄這個(gè)經(jīng)歷,二來(lái)寄希望這些經(jīng)驗(yàn)?zāi)軐?duì)其他人有所助益。

達(dá)人薈接到跨年紅包的工作時(shí),團(tuán)隊(duì)中有并發(fā)經(jīng)驗(yàn)的孫越?jīng)]有時(shí)間做這個(gè)事情,因而開(kāi)發(fā)的工作交給我了。我在這個(gè)時(shí)候沒(méi)有前端和后臺(tái)開(kāi)發(fā)經(jīng)驗(yàn),對(duì)并發(fā)量也沒(méi)有清晰的認(rèn)識(shí),實(shí)現(xiàn)搶紅包的時(shí)間限制(十天)也很緊張。幸運(yùn)的是,有李盼輝孫越這些同伴們一同討論解決問(wèn)題,我們按時(shí)完成了開(kāi)發(fā),經(jīng)過(guò)了幾輪測(cè)試,流程與邏輯上確定沒(méi)有問(wèn)題。做了壓力測(cè)試,并發(fā)量能滿足現(xiàn)場(chǎng)的人數(shù)。但是,壓力測(cè)試很難完全模擬實(shí)際情況,壓力測(cè)試的結(jié)果只能作為參考而不能作為判斷的依據(jù)。


搶紅包的工作流程如下圖所示:


代碼分四個(gè)部分

  1. 搶紅包前端網(wǎng)頁(yè)
  2. 入口服務(wù)器(Python進(jìn)程):通知網(wǎng)頁(yè)是否跳轉(zhuǎn)到搶紅包頁(yè)面
  3. 紅包服務(wù)器(Python進(jìn)程):接受搶紅包請(qǐng)求,與微信紅包服務(wù)器交互發(fā)紅包
  4. 管理員界面程序:發(fā)送開(kāi)始搶紅包命令,定時(shí)(1s)拉取服務(wù)器狀態(tài)在界面上展示

正常的工作流程:

  1. 終端開(kāi)始加載網(wǎng)頁(yè)<font color=red>(1)</font>,向入口服務(wù)器詢問(wèn)入口是否開(kāi)放<font color=red>(3)</font>
  2. 管理員向入口服務(wù)器和紅包服務(wù)器發(fā)送開(kāi)始搶紅包的命令<font color=red>(2)</font>
  3. 終端網(wǎng)頁(yè)進(jìn)入搶紅包頁(yè)面,向紅包服務(wù)器發(fā)紅包請(qǐng)求<font color=red>(4)</font>
  4. 紅包服務(wù)器判斷通過(guò)后,調(diào)用微信紅包接口,發(fā)放紅包<font color=red>(5)</font>
  5. 管理員界面會(huì)定時(shí)向入口服務(wù)器和紅包服務(wù)器發(fā)請(qǐng)求獲取服務(wù)器狀態(tài)<font color=red>(6)</font>

在這樣的流程中,針對(duì)較高的并發(fā)量,我們做了以下考慮:

  1. 主要的網(wǎng)絡(luò)請(qǐng)求是入口查詢請(qǐng)求和搶紅包請(qǐng)求。將這兩個(gè)請(qǐng)求分開(kāi)處理并部署在兩臺(tái)主機(jī)上。
  2. 為前端的靜態(tài)資源設(shè)置了緩存一天,避免重復(fù)下載圖片。
  3. 對(duì)微信紅包服務(wù)器的請(qǐng)求<font color=red>(5)</font>做了異步
  4. 管理員頁(yè)面定時(shí)更新服務(wù)器狀態(tài),及時(shí)發(fā)現(xiàn)問(wèn)題。

現(xiàn)場(chǎng)的實(shí)際情況是這樣的:

觀眾視角:

主持人宣布開(kāi)始倒計(jì)時(shí),點(diǎn)擊進(jìn)入網(wǎng)頁(yè),網(wǎng)頁(yè)特別卡,一直加載中,白屏。有人一直等著,有人放棄了。過(guò)了一會(huì)發(fā)現(xiàn)不那么卡了,進(jìn)去開(kāi)始搶紅包,搶到了/沒(méi)搶到。

我的視角:

主持人宣布開(kāi)始倒計(jì)時(shí),我點(diǎn)下了開(kāi)始按鈕,將開(kāi)始搶紅包的請(qǐng)求發(fā)送給服務(wù)器。此時(shí)周圍不停地傳來(lái)網(wǎng)頁(yè)打不開(kāi)的聲音,我的管理界面也卡死了,不再刷新服務(wù)器的狀態(tài)。

懷疑入口服務(wù)器崩潰了,進(jìn)而聯(lián)想到所有人都不能進(jìn)入搶紅包頁(yè)面,這意味著搶紅包程序的徹底失效。高壓狀態(tài)下的異常情況導(dǎo)致失去了正常的判斷力。唯一能做的就是在一個(gè)卡死的界面上點(diǎn)擊開(kāi)始按鈕而不確定到底發(fā)生了什么。過(guò)了一段時(shí)間,周圍開(kāi)始傳出來(lái)紅包搶到了的消息。

這時(shí)我也基本恢復(fù)了判斷力,和李盼輝一起確認(rèn)當(dāng)前的狀態(tài)。進(jìn)入服務(wù)器發(fā)現(xiàn)后臺(tái)正常,第一輪紅包已經(jīng)發(fā)送完畢。回頭看管理界面程序,管理界面程序已經(jīng)恢復(fù)正常,顯示紅包已經(jīng)發(fā)送完畢。我們檢查一遍代碼邏輯,沒(méi)有發(fā)現(xiàn)問(wèn)題,只能暫時(shí)歸結(jié)為網(wǎng)絡(luò)請(qǐng)求拋出了異常。判斷管理界面不可靠,將開(kāi)始搶紅包的請(qǐng)求從界面程序里抽取出來(lái),下一輪用命令行發(fā)送開(kāi)始請(qǐng)求。


活動(dòng)結(jié)束后,看日志發(fā)現(xiàn):第一輪紅包時(shí),入口服務(wù)器平均每秒鐘收到40個(gè)請(qǐng)求,平均每個(gè)請(qǐng)求的處理時(shí)間是1ms。入口服務(wù)器并沒(méi)有滿負(fù)荷跑,現(xiàn)場(chǎng)發(fā)出的請(qǐng)求個(gè)數(shù)也肯定多于40個(gè)每秒,那么請(qǐng)求就某個(gè)地方阻塞了。

回看服務(wù)器的部署,前端網(wǎng)頁(yè)和入口服務(wù)器部署在一臺(tái)主機(jī)上,網(wǎng)頁(yè)里的所有圖片也都從這臺(tái)主機(jī)獲??!而且加載網(wǎng)頁(yè)和發(fā)請(qǐng)求是串行的。網(wǎng)頁(yè)加載完畢才會(huì)發(fā)出請(qǐng)求。

靜態(tài)資源的緩存在第一波搶紅包中沒(méi)有起到任何作用,因?yàn)榇蠖鄶?shù)觀眾是第一次打開(kāi)網(wǎng)頁(yè)。網(wǎng)頁(yè)里所有的內(nèi)容都要全部加載一遍。HTML文檔的數(shù)據(jù)量小于1KB,而所有圖片的大小共500KB,全場(chǎng)4000人,同時(shí)搶紅包的人數(shù)算2000人,一共1GB的數(shù)據(jù)量需要從主機(jī)傳輸出去。那個(gè)時(shí)刻的網(wǎng)絡(luò)非常的繁忙。

觀眾手機(jī)獲取不了網(wǎng)頁(yè)的背景圖,網(wǎng)頁(yè)自然是白屏的。管理員的界面程序在如此繁忙的網(wǎng)絡(luò)環(huán)境下拉取服務(wù)器狀態(tài),自然會(huì)阻塞超時(shí)。界面程序只有一個(gè)后臺(tái)線程進(jìn)行網(wǎng)絡(luò)請(qǐng)求,阻塞之后,主線程的界面沒(méi)有數(shù)據(jù)來(lái)源自然會(huì)卡死,獲取不到兩個(gè)服務(wù)器的狀態(tài),導(dǎo)致管理員出現(xiàn)對(duì)服務(wù)器狀態(tài)不確定不可控的狀態(tài)。

對(duì)于高并發(fā)的情況,需要注意:每個(gè)網(wǎng)絡(luò)請(qǐng)求都要考慮執(zhí)行時(shí)間,如果這個(gè)請(qǐng)求阻塞了會(huì)有多大的影響?在我的控制界面程序中,單后臺(tái)線程一旦阻塞,所有的網(wǎng)絡(luò)請(qǐng)求都玩完,界面卡死,控制程序失效。這類漏洞,平時(shí)測(cè)試是發(fā)現(xiàn)不了的,只會(huì)在并發(fā)環(huán)境下體現(xiàn)出來(lái)。

找到原因后,解決辦法也很簡(jiǎn)單,把圖片等靜態(tài)資源托管到第三方服務(wù)器。對(duì)于每個(gè)用戶,500KB的圖片從第三方主機(jī)獲取,我們的主機(jī)只負(fù)責(zé)不到1KB的HTML和接口數(shù)據(jù)。在跨年之前測(cè)試的入口服務(wù)器的并發(fā)量是每秒600次請(qǐng)求。如果沒(méi)有圖片流量,服務(wù)器完全能應(yīng)付這樣的并發(fā)量。

事實(shí)就是這么的簡(jiǎn)單,直接。過(guò)多的圖片數(shù)據(jù)把主機(jī)網(wǎng)絡(luò)堵塞了。

因?yàn)榫彺?,忽略了這些圖片。因?yàn)檫@些圖片導(dǎo)致了網(wǎng)頁(yè)的卡卡卡。只需要做很少的工作就能把卡卡卡消滅,而我卻沒(méi)有意識(shí)到。編碼工作培養(yǎng)的是對(duì)數(shù)據(jù)狀態(tài)的敏感度,比如數(shù)據(jù)庫(kù),多線程同步,異常等等。而并發(fā)狀態(tài)下還需要對(duì)機(jī)器的網(wǎng)絡(luò)狀態(tài)敏感,主機(jī)需要通過(guò)網(wǎng)絡(luò)發(fā)送哪些數(shù)據(jù),可能的網(wǎng)絡(luò)狀態(tài)是什么,堵塞還是暢通。這個(gè)教訓(xùn)我會(huì)記住的。

總結(jié)一下,這些經(jīng)驗(yàn)需要記?。?/p>

  1. 壓力測(cè)試要盡可能模擬真實(shí)的情況,測(cè)試結(jié)果才能作為參考依據(jù)。
  2. 合理處理好圖片等靜態(tài)資源,靜態(tài)資源的大小會(huì)遠(yuǎn)大于路由請(qǐng)求的數(shù)據(jù)量。
  3. 每個(gè)網(wǎng)絡(luò)請(qǐng)求都要考慮執(zhí)行時(shí)間,如果這個(gè)請(qǐng)求超時(shí)了會(huì)有多大的影響?
  4. 編碼工作培養(yǎng)的是對(duì)數(shù)據(jù)狀態(tài)的敏感度,比如數(shù)據(jù)庫(kù),多線程同步,異常等等。而并發(fā)狀態(tài)下還需要對(duì)機(jī)器的網(wǎng)絡(luò)狀態(tài)敏感,主機(jī)需要通過(guò)網(wǎng)絡(luò)發(fā)送哪些數(shù)據(jù),可能的網(wǎng)絡(luò)狀態(tài)是什么,堵塞還是暢通。

令人開(kāi)心的是:除了圖片流量導(dǎo)致的卡卡卡之外,程序運(yùn)行一切正常??ㄖ笏屑t包發(fā)送完畢。代碼我已經(jīng)托管在Github上,有類似微信紅包開(kāi)發(fā)需求的可以參考。

最后,感謝達(dá)人薈的各位小伙伴們,跟你們一起做事很開(kāi)心。感謝東南大學(xué)跨年晚會(huì)和達(dá)人薈給了我這樣一個(gè)深刻又難以忘記的跨年夜。這樣度過(guò)在東大的第七個(gè)也是最后一個(gè)跨年夜,真是一番奇妙的經(jīng)歷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評(píng)論 25 709
  • 從14年初,微信紅包第一版產(chǎn)品上線之后,紅包這種集合互動(dòng)傳播、支付、營(yíng)銷等眾多功能于一體的產(chǎn)品便以不可思議的速度紅...
    65f9370eaa13閱讀 4,117評(píng)論 5 63
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 馮宇平:第6屆中國(guó)工藝美術(shù)大師,吉林省宇平工藝品制造有限公司董事長(zhǎng)。 文/楊登甲 圖片提供/宇平工藝品制造有限公司...
    sayulynn閱讀 1,422評(píng)論 0 0
  • 創(chuàng)生命 好風(fēng)水天天喜悅天天親開(kāi)明現(xiàn)在學(xué)眾事學(xué)習(xí)眾人學(xué)習(xí)行 學(xué)習(xí)生命本生涯學(xué)習(xí)重視開(kāi)明理體會(huì)重視明白事看開(kāi)眾里...
    東風(fēng)唐閱讀 255評(píng)論 0 0

友情鏈接更多精彩內(nèi)容