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