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