張會(huì)敏
(中北大學(xué)軟件學(xué)院,山西 太原 030051)
電商網(wǎng)站秒殺系統(tǒng)的研究與對(duì)策
張會(huì)敏
(中北大學(xué)軟件學(xué)院,山西 太原 030051)
簡(jiǎn)要研究了電商網(wǎng)站秒殺應(yīng)用的高并發(fā)訪問(wèn)問(wèn)題,分析了其主要特點(diǎn),然后從系統(tǒng)架構(gòu)、程序開發(fā)2個(gè)方面入手,詳細(xì)分析了架構(gòu)分層、緩存、異步方法、消息隊(duì)列、代碼實(shí)現(xiàn)等內(nèi)容,并提出了相關(guān)問(wèn)題的解決方法.
分層設(shè)計(jì);異步方法;頁(yè)面靜態(tài)化;秒殺系統(tǒng)
大型的電商網(wǎng)站,例如京東、阿里系、亞馬遜中國(guó),都有各自的秒殺系統(tǒng).秒殺活動(dòng)是網(wǎng)站的一種重要營(yíng)銷手段,在營(yíng)銷過(guò)程中占有舉足輕重的位置.秒殺會(huì)吸引大量用戶搶購(gòu),會(huì)在約定的時(shí)間點(diǎn)同時(shí)在相應(yīng)的頁(yè)面內(nèi)搶購(gòu)約定數(shù)量的商品,并在規(guī)定時(shí)間內(nèi)結(jié)束.通常情況下,秒殺的時(shí)限都很短.秒殺系統(tǒng)是典型的高并發(fā)應(yīng)用.秒殺時(shí),大量用戶會(huì)在同一時(shí)間搶購(gòu),網(wǎng)站瞬時(shí)流量激增.秒殺時(shí),訪問(wèn)請(qǐng)求數(shù)量遠(yuǎn)遠(yuǎn)大于庫(kù)存數(shù)量,最終只有極少數(shù)用戶能夠秒殺成功.此類高并發(fā)應(yīng)用在電商網(wǎng)站舉行一些其他活動(dòng)或者在12306網(wǎng)站上搶票時(shí)常會(huì)遇到.系統(tǒng)軟硬件無(wú)法處理如此巨大的計(jì)算量,進(jìn)而出現(xiàn)響應(yīng)速度慢,甚至出現(xiàn)處理出錯(cuò)、系統(tǒng)宕機(jī)等問(wèn)題,進(jìn)而導(dǎo)致整個(gè)系統(tǒng)癱瘓.
在高并發(fā)的情況下,網(wǎng)站如何才能穩(wěn)定、持續(xù)工作一直是一個(gè)難題.本文從軟件的架構(gòu)設(shè)計(jì)和實(shí)現(xiàn)層面出發(fā)提出相應(yīng)的解決方案,即在系統(tǒng)中使用分層與組件化的架構(gòu),并配合緩存、消息隊(duì)列.在實(shí)現(xiàn)方面,針對(duì)秒殺應(yīng)用的特點(diǎn),引入了異步方法、表現(xiàn)與數(shù)據(jù)分離的方法.
從業(yè)務(wù)規(guī)則的角度講,設(shè)計(jì)秒殺系統(tǒng)有2個(gè)關(guān)鍵,即庫(kù)存管理和訂單處理.當(dāng)用戶搶購(gòu)時(shí),系統(tǒng)需要判斷是否還有庫(kù)存;當(dāng)用戶提交訂單時(shí),系統(tǒng)需要按照提交訂單請(qǐng)求的順序依次創(chuàng)建訂單.當(dāng)然這只是最簡(jiǎn)化的秒殺設(shè)計(jì).事實(shí)上還涉及到其他的附屬環(huán)節(jié),例如積分、在線支付、物流配送,等等.
在此必須明確的前提是,高并發(fā)應(yīng)用是一個(gè)有機(jī)系統(tǒng),整個(gè)系統(tǒng)的優(yōu)化與提高來(lái)自每個(gè)組件的優(yōu)化,它們共同組成一個(gè)強(qiáng)大的系統(tǒng),以面對(duì)每秒幾十萬(wàn)級(jí)甚至百萬(wàn)級(jí)的訪問(wèn)量.
在服務(wù)后端,可以使用負(fù)載均衡、集群技術(shù).負(fù)載均衡、集群技術(shù)可以分別部署在Web服務(wù)器層、應(yīng)用服務(wù)器層、數(shù)據(jù)存取層和數(shù)據(jù)庫(kù)層.也就是說(shuō),在服務(wù)后端進(jìn)行了更細(xì)粒度的分層,從而極大地提高系統(tǒng)的負(fù)載能力.
具體來(lái)講,在Web服務(wù)器層配置Apache/Nginx的反向代理,實(shí)現(xiàn)多臺(tái)服務(wù)器的負(fù)載均衡,同時(shí),在應(yīng)用服務(wù)器層也部署負(fù)載均衡.而在數(shù)據(jù)庫(kù)存儲(chǔ)層,則有更多靈活的方法可以使用,比如數(shù)據(jù)庫(kù)集群、讀寫表分離等性能調(diào)優(yōu)手段.此外,各廠家也有其成熟的方案,比如Oracle的表與索引的分區(qū)技術(shù).
從客戶端的角度出發(fā),可使用表現(xiàn)與數(shù)據(jù)分離的架構(gòu).隨著CPU/GPU的發(fā)展,計(jì)算機(jī)的計(jì)算能力越來(lái)越強(qiáng),將一些計(jì)算邏輯分散到客戶端,可以明顯降低服務(wù)后端的計(jì)算壓力.前后端之間通過(guò)傳送小巧的JSON數(shù)據(jù)進(jìn)行交互,也降低了應(yīng)用對(duì)網(wǎng)絡(luò)帶寬的要求.
這里所說(shuō)的緩存包含以下2個(gè)層面:①靜態(tài)資源緩存,比如圖片文件、CSS樣式表、JavaScript文件.靜態(tài)資源緩存的效果最直接.通過(guò)緩存靜態(tài)文件,并配合CDN(內(nèi)容分發(fā)網(wǎng)絡(luò)),可以極大地提高頁(yè)面的訪問(wèn)速度.同時(shí),配合合理的超期規(guī)則,可以正確、及時(shí)地更新這些靜態(tài)資源文件.②引入專用的緩存服務(wù)器,例如Redis、Memcached.這類緩存服務(wù)器是通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少系統(tǒng)資源消耗巨大的讀取數(shù)據(jù)庫(kù)動(dòng)作的次數(shù),從而提高動(dòng)態(tài)數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的響應(yīng)速度.
使用異步方法是架構(gòu)高并發(fā)秒殺應(yīng)用的關(guān)鍵.異步方法是非阻塞調(diào)用,該調(diào)用不會(huì)阻塞當(dāng)前線程.具體來(lái)說(shuō),就是在服務(wù)后端使用消息隊(duì)列.在同步阻塞模式下,眾多用戶并發(fā)訪問(wèn)時(shí),數(shù)據(jù)庫(kù)訪問(wèn)層很容易因?yàn)閿?shù)據(jù)庫(kù)的鎖機(jī)制導(dǎo)致壓力迅速攀升,很快宕機(jī).使用異步處理方法,讓用戶提交的搶購(gòu)請(qǐng)求首先進(jìn)入隊(duì)列,可以徹底解決數(shù)據(jù)庫(kù)鎖引起的問(wèn)題.在搶購(gòu)結(jié)束后,再把隊(duì)列中的信息存入數(shù)據(jù)庫(kù),形成訂單數(shù)據(jù).因此,對(duì)于秒殺系統(tǒng)而言,流程就變成了這個(gè)樣子:用戶搶購(gòu)商品,提交的搶購(gòu)請(qǐng)求進(jìn)入隊(duì)列,用戶收到搶購(gòu)成功消息(有庫(kù)存的情況),或者接收到搶購(gòu)失敗的消息(商品已經(jīng)搶完了).
實(shí)際的訂單操作則在另外的"空間"存儲(chǔ)成數(shù)據(jù)庫(kù)表中的訂單記錄.這樣的設(shè)計(jì)完美解決了數(shù)據(jù)庫(kù)記錄鎖的問(wèn)題,而且保證了數(shù)據(jù)的一致性、系統(tǒng)的可靠性.不過(guò)在極端場(chǎng)景下,因?yàn)檎?qǐng)求過(guò)多,很可能會(huì)一瞬間將隊(duì)列內(nèi)存"撐爆",系統(tǒng)也會(huì)陷入異常狀態(tài).簡(jiǎn)單的隊(duì)列也無(wú)法滿足高并發(fā)Web應(yīng)用的需求,所以,推薦使用消息隊(duì)列中間件軟件,比如Redis、WebSphere MQ和ActiveMQ等.
從程序設(shè)計(jì)的角度來(lái)講,可以考慮從以下幾個(gè)方面進(jìn)行優(yōu)化:①前后端分離.前端負(fù)責(zé)頁(yè)面的UI和對(duì)應(yīng)邏輯處理,后臺(tái)負(fù)責(zé)業(yè)務(wù)規(guī)則的處理和計(jì)算,兩者通過(guò)JSON數(shù)據(jù)進(jìn)行交互.②優(yōu)化頁(yè)面的靜態(tài)資源文件.比如采用Sprite圖將許多小圖片圖標(biāo)集成到一張大圖上,合并并且壓縮處理CSS樣式表、JavsScript源碼文件.這樣的處理方式可以大大減少客戶端對(duì)服務(wù)器端的Socket請(qǐng)求數(shù)量.③將動(dòng)態(tài)網(wǎng)頁(yè)信息靜態(tài)化,結(jié)合一些JavaScript模板引擎,實(shí)現(xiàn)這些頁(yè)面的數(shù)據(jù)動(dòng)態(tài)綁定.④在數(shù)據(jù)存儲(chǔ)層,使用緩存工具,比如Spring和Hibernate.
綜上所述,高并發(fā)應(yīng)用是一個(gè)復(fù)雜系統(tǒng),它涉及到軟硬件、服務(wù)器、數(shù)據(jù)庫(kù)和中間件等方方面面的內(nèi)容.構(gòu)建高并發(fā)Web應(yīng)用,基本出發(fā)點(diǎn)是系統(tǒng)分層與解耦,將系統(tǒng)組件化,讓每個(gè)組件充分發(fā)揮其效能,同時(shí),還可以靈活擴(kuò)展.高并發(fā)Web應(yīng)用采取的2個(gè)關(guān)鍵技術(shù)是緩存和異步方法,這2種技術(shù)可以應(yīng)用于高并發(fā)Web應(yīng)用的不同分層中.另外,高并發(fā)Web應(yīng)用對(duì)程序的開發(fā)也提出了更多的要求.
[1]邵斐.面向電子商務(wù)的秒殺系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2015,34(6):84-87.
[2]王亞楠,吳華瑞,黃鋒.高并發(fā)Web應(yīng)用系統(tǒng)的性能優(yōu)化分析與研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2014(8):2976-2980.
[3]李軍鋒,何明昕.高并發(fā)Web航空票務(wù)秒殺系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2013,34(3):778-782.
[4]倪高鵬.基于Memcached的緩存系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].大連:大連理工大學(xué),2012.
[5]林克,羅喧,李凌,等.支持高并發(fā)處理的新型票務(wù)應(yīng)用系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電信科學(xué),2015,31(10):130-136.
[6]彭海平.電子商務(wù)平臺(tái)的性能優(yōu)化和高可靠性研究與實(shí)現(xiàn)[D].上海:上海交通大學(xué),2007.
[7]白鑫.基于Redis的信息存儲(chǔ)優(yōu)化技術(shù)研究與應(yīng)用[D].北京:北方工業(yè)大學(xué),2014.
[8]包立輝,黃彥飛.高并發(fā)網(wǎng)站的架構(gòu)研究及解決方案[J].計(jì)算機(jī)科學(xué),2012,39(10):184-187.
[9]楊振靈.高并發(fā)數(shù)據(jù)庫(kù)訪問(wèn)性能測(cè)試與制約因素分析[J].大眾科技,2016,18(6):7-10.
〔編輯:白潔〕
TP311.52
A
10.15913/j.cnki.kjycx.2017.22.075
2095-6835(2017)22-0075-02