一次簡單的微信秒殺活動(dòng)

基本任務(wù)

中秋節(jié)的前一天,SAE突然接到一個(gè)電話,有這么一個(gè)客戶,他們專門給銀行、基金公司提供營銷服務(wù),這回他們服務(wù)的是一個(gè)“金主”,準(zhǔn)備做一個(gè)在中秋節(jié)當(dāng)天通過微信發(fā)送現(xiàn)金紅包的活動(dòng),活動(dòng)本身就是一個(gè)HTML5頁面,里面的邏輯不難,也就不到1000行代碼,大體是:


if ( 該用戶沒有參與過活動(dòng) & 余額有錢)
? ? 跳轉(zhuǎn)到游戲頁面
? ? begin game
? ? 生成中獎(jiǎng)信息
? ? 扣款
? ? 調(diào)用微信紅包API
? ? end game
else
? ? 提示“已經(jīng)參與過了”,并顯示中獎(jiǎng)信息



那么問題來了

就這么一個(gè)簡單的業(yè)務(wù),卻困擾了這個(gè)客戶長達(dá)兩年,連續(xù)兩年的中秋抽獎(jiǎng)都沒有成功過,每次都以宕機(jī)=》刷不出頁面結(jié)束,作為營銷公司,他們也受到了他們的客戶的質(zhì)疑。那么前兩年的抽獎(jiǎng)活動(dòng)怎么做的呢?

第一年:用自己的服務(wù)器,12核/16G內(nèi)存一臺(tái),里面跑著LAMP(Apache+MySQL+PHP),結(jié)果CPU跑滿,不得不停重啟

第二年:用了某云的云服務(wù)器,16核心/32G內(nèi)存,IO優(yōu)化實(shí)例一個(gè),里面跑著LAMP(同上),結(jié)果負(fù)載巨高,響應(yīng)巨慢

很不幸,兩次活動(dòng)都不成功,所以客戶找到了SAE。。。

分析問題

得到需求后,因?yàn)殡x最終上線只有一天,SAE立即派出技術(shù)團(tuán)隊(duì)到了位于北京西直門的這家上市營銷公司了解情況,經(jīng)過溝通,我們來分析一下這個(gè)案例:

- 1,此次活動(dòng)的領(lǐng)域基本集中在朋友圈傳播,目的是增加粉絲,并不是轉(zhuǎn)發(fā)量,所以沒有動(dòng)用大號(hào)轉(zhuǎn)發(fā),加上抽的是實(shí)際現(xiàn)金(他們的客戶要求必須現(xiàn)金不玩假抽獎(jiǎng)劵,果然金主啊^_^),很快會(huì)抽完,持續(xù)時(shí)間不長,所以總體量不大

- 2,錢是通過微信接口預(yù)充進(jìn)去的,最麻煩的支付扣款是調(diào)用微信接口,用戶看到的就是一個(gè)標(biāo)準(zhǔn)的紅包頁面,所以免去了事務(wù)支付的重邏輯

- 3,訪問的終端用戶是銀行的全國用戶,HTML5游戲里面含大量靜態(tài)元素,原程序沒有使用CDN做資源加速

- 4,原有邏輯大量依賴MySQL數(shù)據(jù)庫,且表結(jié)構(gòu)存在不合理,也沒有適當(dāng)?shù)氖褂胏ache,更沒有使用讀寫分離,導(dǎo)致瞬間數(shù)據(jù)庫壓力過大

- 5,業(yè)務(wù)上沒有峰值預(yù)案,也沒有降級(jí)邏輯

- 6,只使用云主機(jī),不具備自動(dòng)擴(kuò)容能力,客戶也沒有scale out的實(shí)施經(jīng)驗(yàn)

解決

考慮到這些原因,同時(shí)考慮到離實(shí)際活動(dòng)發(fā)布還有不到12個(gè)小時(shí),不可能對(duì)原有邏輯進(jìn)行大改,所以只能放棄5(降級(jí)邏輯)

那么,我們所做的工作有:

1,將業(yè)務(wù)放到SAE上,因?yàn)镾AE實(shí)現(xiàn)了基于HTTP Request的container,可以隨著請(qǐng)求的增多而自動(dòng)擴(kuò)容,整個(gè)過程用戶無感知也無需關(guān)心,換句話說從1000PV到10億PV用戶無需做任何變動(dòng)即可完成,這樣首先解決Apache+PHP的運(yùn)行負(fù)載問題

2,單單完成1是不夠的,因?yàn)樯婕暗綌?shù)據(jù)庫還是單點(diǎn),所以我們協(xié)助用戶修改數(shù)據(jù)操作為讀寫分離,根據(jù)這個(gè)業(yè)務(wù)場景,用戶的錢可以有一些誤差,不是嚴(yán)格要求發(fā)放XX萬元整(因?yàn)槭S嗟腻X微信會(huì)退回商家),于是,諸如余額是否有錢的操作不必嚴(yán)格使用tranaction保證,可以直接從從庫判斷

3,增加cache層,首先設(shè)置HTTP過期header和啟用CDN,從多個(gè)層面增加cache效果,在SAE上啟用CDN非常簡單,參考http://www.sinacloud.com/doc/sae/php/cdn.html,只要將資源地址改成CDN域名即可;使用memcache服務(wù)作為數(shù)據(jù)cache層,所有數(shù)據(jù)均從cache讀取,對(duì)于需要事務(wù)的數(shù)據(jù),使用memcache::add操作間接實(shí)現(xiàn),另外說一句,SAE上memcache不像目前的所謂的“微服務(wù)”,需要用戶自己創(chuàng)建,而是SAE官方自帶的“池化”服務(wù),每個(gè)用戶自動(dòng)可以使用多達(dá)4T的內(nèi)存cache。

4,變數(shù)據(jù)庫批量并發(fā)寫為有限并發(fā)異步寫,創(chuàng)建了一個(gè)TaskQueue,將所有的數(shù)據(jù)庫寫操作放入并發(fā)度為16的Queue,通過該Queue異步update數(shù)據(jù)庫。同時(shí),SAE為企業(yè)用戶提供了最高50000 IOPS的DB實(shí)例。

5,因?yàn)闀r(shí)間關(guān)系,未完成的邏輯有:變簡單寫操作從MySQL轉(zhuǎn)到KVDB(NoSQL數(shù)據(jù)庫);增加業(yè)務(wù)降級(jí)開關(guān),緊急情況下操作HTML5客戶端隨機(jī)數(shù),控制到達(dá)服務(wù)端的用戶數(shù)量

在完成這些修改后,應(yīng)用戶的強(qiáng)烈要求,SAE還將這家營銷公司的賬號(hào)企業(yè)等級(jí)臨時(shí)從高級(jí)型調(diào)整成最高等級(jí)(合作伙伴級(jí))一天,來準(zhǔn)備應(yīng)對(duì)中秋的秒殺活動(dòng)。至此,我們已經(jīng)堅(jiān)信這次秒殺可以支持瞬間10萬并發(fā),這個(gè)指標(biāo)已經(jīng)超過用戶設(shè)計(jì)的十倍,當(dāng)然,客戶還是將信將疑,那么結(jié)果呢?

結(jié)果

客戶的活動(dòng)準(zhǔn)時(shí)在2015年9月27日上午10點(diǎn)整開始:

峰值曲線

如上圖所述,中秋槍紅包活動(dòng)發(fā)布后,最高時(shí)達(dá)到了7萬次請(qǐng)求/秒,在紅包空了以后,請(qǐng)求迅速下降。同時(shí),從用戶日志看,沒有錯(cuò)誤日志產(chǎn)生,也沒有502、504等超時(shí)現(xiàn)象,根據(jù)客戶反饋,該次活動(dòng)非常成功,他們的客戶的現(xiàn)金紅包大約在30秒內(nèi)被搶光。之后,我們查閱了當(dāng)時(shí)memcache集群和MySQL集群的狀態(tài),所有服務(wù)參數(shù)顯示正常,證明這次秒殺行為從技術(shù)上完全滿足。

總結(jié)

其實(shí),從互聯(lián)網(wǎng)的業(yè)務(wù)看,這次活動(dòng)也不算太大,畢竟客戶追求的并不是轉(zhuǎn)發(fā)量而是粉絲數(shù),另外他們的客戶的紅包金額也不是巨大,所以這次業(yè)務(wù)的峰值量離我們的預(yù)估還有一定距離,但從這次秒殺行為還有一些經(jīng)驗(yàn)需要總結(jié)的:

1,不要迷信云服務(wù),IaaS幾乎不能幫用戶解決完全自動(dòng)的擴(kuò)容問題,SAE也只能幫用戶解決無狀態(tài)的服務(wù)擴(kuò)容,但像強(qiáng)業(yè)務(wù)邏輯的數(shù)據(jù)擴(kuò)容還是有賴于用戶自己解決,比如如果用戶還是把所有的庫、表操作放到一個(gè)單點(diǎn)執(zhí)行,即使放到SAE上,也還是會(huì)出現(xiàn)瓶頸。

2,充分利用cache,cache不僅僅是利用redis或者memcache,而應(yīng)該是從客戶端、到代理層、到Runtime層、到數(shù)據(jù)庫的各級(jí)cache,同時(shí)利用cache的過期時(shí)間,合理控制cache的實(shí)效性弊端

3,變一切同步操作為異步操作,尤其是寫數(shù)據(jù)庫的重操作,可以使用諸如TaskQueue服務(wù)來將邏輯異步化,讓整個(gè)用戶體驗(yàn)不存在阻塞邏輯

最后,還要在業(yè)務(wù)邏輯上實(shí)現(xiàn)可降級(jí)可控制,這點(diǎn)雖然因?yàn)闀r(shí)間關(guān)系未能在實(shí)際代碼上有所體現(xiàn),但是在實(shí)際大型業(yè)務(wù)確是最重要的。

當(dāng)然,這里講的秒殺還不包括支付系統(tǒng)的,從這點(diǎn)來說,這個(gè)案例要比淘寶、天貓等簡單成千上萬倍,我們也歡迎對(duì)秒殺技術(shù)有興趣的小伙伴一起參與討論,一起提高。

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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