2020年06月06日
1引言
随着互聯網的(of)快速發展和(and)互聯網用(use)戶量的(of)急劇增加,高并發Web應用(use)系統面臨更大(big)的(of)并發訪問壓力,容易出(out)現網站響應時(hour)間過長,甚至會出(out)現服務器壓力過大(big),導緻系統崩潰等問題。12306鐵路購票網站就是(yes)一(one)個(indivual)典型的(of)高并發Web應用(use)。2012年春運期間,該網站日均近10億次訪問,同時(hour)在(exist)線人(people)數高達500萬,如此高的(of)負載與高并發量使網站訪問擁堵,頻繁出(out)現錯誤,大(big)量用(use)戶買不(No)到(arrive)票。
電商應用(use)是(yes)一(one)類有代表性的(of)高并發Web應用(use)。目前針對高并發Web應用(use)系統性能低下的(of)問題,解決的(of)方案主要(want)圍繞以(by)下幾個(indivual)方面:提高數據庫配置、優化數據庫性能、優化服務器參數配置、優化網絡拓撲結構和(and)Web容器的(of)性能,但上(superior)述方法限制了(Got it)系統的(of)擴展性,并加大(big)了(Got it)系統的(of)開發和(and)維護成本。本文從網站的(of)系統架構入手,提出(out)了(Got it)一(one)個(indivual)高并發Web電商系統的(of)解決方案,針對Web前端、後台程序、數據庫和(and)服務器4個(indivual)部分的(of)處理給出(out)了(Got it)優化方案。在(exist)最近的(of)100次測試中承受住了(Got it)近12萬次的(of)訪問,在(exist)解決高并發訪問的(of)問題上(superior)取得了(Got it)較好效果。
2電商系統的(of)特點、目标和(and)流程分析
2.1電商系統的(of)特點
電商系統平時(hour)的(of)訪問量不(No)是(yes)特别大(big),因爲(for)用(use)戶會在(exist)不(No)同的(of)時(hour)間段來(Come)選擇商品。但是(yes),在(exist)年中和(and)雙十一(one)等購物狂歡節,同一(one)時(hour)間訪問的(of)用(use)戶量過多,後台服務器瞬間接收的(of)請求量過大(big),巨大(big)的(of)訪問量會導緻服務器崩潰等嚴重後果,降低用(use)戶體驗的(of)同時(hour)也會造成很大(big)的(of)損失。此時(hour),電商系統的(of)前端Web和(and)後台數據庫查詢都面臨高并發問題。
2.2電商系統的(of)設計目标
電商系統的(of)設計目标主要(want)有:1)滿足高并發訪問。這(this)是(yes)電商系統的(of)主要(want)目标和(and)首要(want)解決的(of)問題。2)高可用(use)性。将停止服務時(hour)間降到(arrive)最低甚至是(yes)無間斷服務。3)可擴展性。随着訪問量的(of)增加,系統具有良好的(of)伸縮能力。4)高可靠性。經過優化的(of)體系結構和(and)合理的(of)備份策略,使得電商系統具有穩定性,發生(born)故障時(hour)能快速排查和(and)恢複。
2.3電商系統的(of)流程
電商系統的(of)流程爲(for)用(use)戶注冊、用(use)戶登錄、用(use)戶查詢商品、添加購物車、提交訂單、付款、送貨等。具體流程是(yes)用(use)戶在(exist)訪問商品信息時(hour)看到(arrive)商品的(of)價格、用(use)途等屬性,将需要(want)的(of)商品加入購物車。購物車自動計算商品的(of)總價,之後用(use)戶想提交訂單時(hour),若用(use)戶是(yes)遊客,則會提示用(use)戶注冊;若用(use)戶是(yes)電商系統的(of)會員,則在(exist)用(use)戶信息齊全的(of)條件下可以(by)進行支付。支付成功後接到(arrive)支付成功的(of)信息而更改狀态,商戶通知物流發貨,用(use)戶收到(arrive)貨物後确認收貨,交易完成。
3電商系統的(of)架構與負載均衡
爲(for)了(Got it)解決高并發問題,最重要(want)的(of)是(yes)系統架構設計。本節首先介紹電商系統的(of)功能模塊及瓶頸,然後介紹負載均衡技術,最後給出(out)一(one)個(indivual)應對高并發的(of)架構解決方案。
3.1電商系統的(of)功能及瓶頸
如圖1所示,電商系統的(of)主要(want)功能包括商品模塊、用(use)戶模塊、訂單模塊、反饋模塊和(and)統計模塊。商品模塊包括商品的(of)添加、修改及商品信息的(of)管理。用(use)戶模塊包括用(use)戶的(of)注冊、登錄、權限的(of)管理和(and)用(use)戶信息的(of)維護。統計模塊包括統計商品信息、用(use)戶信息和(and)用(use)戶點擊,購買的(of)商品的(of)統計信息。反饋模塊收集用(use)戶對商品的(of)評論,同時(hour)回答用(use)戶的(of)問題。訂單模塊是(yes)用(use)戶添加購物車、下單、付款和(and)物流等流程。
在(exist)功能模塊中,用(use)戶模塊一(one)般不(No)會成爲(for)高并發的(of)瓶頸。系統規定隻有注冊并登錄過的(of)模塊才能參與購物,由于(At)注冊和(and)登錄的(of)時(hour)間分散,一(one)般不(No)會造成高并發問題。反饋模塊和(and)統計模塊也不(No)是(yes)高并發問題産生(born)的(of)主要(want)地(land)方。商品模塊和(and)支付模塊往往是(yes)高并發問題出(out)現的(of)主要(want)位置,在(exist)購物狂歡節開始的(of)短短幾分鍾内,會産生(born)極大(big)的(of)并發流量,對系統造成巨大(big)壓力,本文應用(use)負載均衡和(and)緩存等技術來(Come)減輕并發壓力。
3.2電商系統的(of)負載均衡方案
在(exist)電商系統中,尤其是(yes)在(exist)高并發、多節點的(of)情況下,經常會出(out)現服務器負載過重的(of)情況,而單純的(of)升級一(one)台服務器的(of)配置已經不(No)能滿足需求,必須設置多台物理服務器,采用(use)負載均衡技術構建系統。
負載均衡好處是(yes):1)将負載分擔在(exist)多台服務器上(superior),解決了(Got it)高并發難題;2)增強了(Got it)安全性;3)改善了(Got it)可擴展性。負載均衡可分爲(for),1)前端Web服務器的(of)負載均衡;2)邏輯層應用(use)服務器負載均衡;3)後端數據庫和(and)文件系統的(of)負載均衡。負載均衡實現的(of)方法主要(want)有:1)軟件負載均衡;2)硬件負載均衡;3)反向代理負載均衡;4)DNS負載均衡;5)基于(At)NAT的(of)負載均衡。
本方案采用(use)硬件和(and)反向代理方式,用(use)F5負載均衡器和(and)Nginx反向代理服務器實現負載均衡。F5由于(At)其穩定性和(and)技術成熟,應用(use)于(At)諸多大(big)型網站。F5負載均衡器的(of)優點有:1)管理簡單,方便操作(do)和(and)維護;2)容易部署和(and)擴展;3)提高系統安全性;4)F5具有緩存功能;5)開啓并使用(use)了(Got it)F5的(of)SSL加速功能。Nginx是(yes)一(one)個(indivual)高性能的(of)HTTP和(and)反向代理服務器,是(yes)目前使用(use)很廣泛的(of)HTTP軟負載均衡器,因高效的(of)性能、穩定性和(and)低系統資源的(of)消耗而聞名于(At)業界。許多大(big)型門戶及商業網站都采用(use)Nginx進行HTTP網站的(of)數據分流。
3.3電商系統的(of)架構
電商系統的(of)系統架構圖如圖2所示。
圖2 電商系統架構圖
根據三層邏輯結構,将Web服務器、應用(use)服務器和(and)數據庫服務器三層分離。在(exist)Web服務器群前端應用(use)Nginx反向代理服務器和(and)F5負載均衡器進行負載均衡,并在(exist)Nginx反向代理服務器和(and)F5負載均衡器中進行緩存設置。系統使用(use)服務器集群和(and)分布式系統改善性能,将多台Web服務器與多台應用(use)服務器相連,最後再連接分布式緩存服務器、文件服務器和(and)數據庫服務器,其中數據庫服務器分爲(for)主從服務器,主服務器主要(want)完成寫操作(do),從服務器完成讀操作(do)。
4電商系統的(of)優化方案
在(exist)實際應用(use)中,影響Web電商系統性能的(of)因素有很多,本節主要(want)從Web前端、後台程序、數據庫以(by)及服務器四個(indivual)方面給出(out)應對高并發的(of)系統優化方案。
4.1電商系統的(of)Web前端優化方案
對于(At)高并發電商網站,頁面質量是(yes)影響網站運行速度的(of)重要(want)原因之一(one)。首先要(want)考慮的(of)是(yes)頁面的(of)大(big)小,如果頁面設計的(of)太大(big),在(exist)頁面加載時(hour)就會耗費大(big)量的(of)網絡帶寬,因此,頁面設計應盡可能地(land)簡潔,以(by)此減少不(No)必要(want)的(of)網絡流量,進而有效的(of)減緩高并發帶來(Come)的(of)帶寬壓力。
另外,現在(exist)廣泛采用(use)動态網頁,在(exist)加載這(this)些頁面中的(of)動态元素時(hour),也會大(big)大(big)增加服務器的(of)負擔,利用(use)頁面壓縮技術和(and)頁面靜态化技術可以(by)有效解決該問題。電商系統中的(of)首頁index.jsp和(and)支付頁面pay.jsp是(yes)用(use)戶最常訪問的(of)兩個(indivual)頁面。本方案在(exist)Web服務器上(superior)部署了(Got it)頁面靜态化服務。當用(use)戶需要(want)訪問首頁和(and)支付頁面時(hour),就不(No)需要(want)訪問應用(use)服務器,訪問到(arrive)的(of)就是(yes)Web服務器中已經靜态化的(of)in⁃dex.html和(and)pay.html。這(this)樣可以(by)大(big)幅提高加載和(and)訪問速度。頁面壓縮技術是(yes)指系統開啓Apache的(of)Gzip壓縮,将頁面壓縮後再傳送。此技術有效減少了(Got it)頁面尺寸,節省了(Got it)大(big)量帶寬,緩解了(Got it)高并發壓力。
4.2電商系統的(of)後台程序優化方案
4.2.1電商系統的(of)緩存方案
緩存技術是(yes)解決高并發難題的(of)一(one)個(indivual)重要(want)手段。電商系統中的(of)緩存技術是(yes)指将用(use)戶要(want)訪問的(of)數據存在(exist)服務器内存中,當用(use)戶要(want)訪問這(this)些數據時(hour)就不(No)再訪問數據庫;而數據庫詢問是(yes)系統最耗時(hour)的(of)工作(do),該技術大(big)幅提升了(Got it)訪問速度,減小了(Got it)各台服務器的(of)負擔,緩解了(Got it)高并發所帶來(Come)的(of)擁堵。根據緩存的(of)位置與内容不(No)同,Web緩存主要(want)分爲(for):1)前端頁面緩存;2)浏覽器和(and)客戶端緩存;3)後端數據庫的(of)數據緩存。
根據電商系統的(of)系統架構圖,本方案利用(use)CDN服務器、Nginx服務器和(and)F5服務器提供緩存功能,将首頁index.html、支付頁面pay.html等經過處理的(of)常用(use)靜态化頁面放進緩存。在(exist)高并發的(of)環境下,這(this)樣可以(by)有效地(land)降低前台Web服務器集群的(of)訪問壓力,同時(hour)也可以(by)大(big)大(big)提高訪問效率。此外,爲(for)了(Got it)減小數據庫訪問壓力,本方案在(exist)數據庫與應用(use)服務器之間配置了(Got it)redis服務器。将用(use)戶常用(use)的(of)查詢結果存在(exist)redis緩存中,當用(use)戶再次訪問時(hour),先檢查緩存中是(yes)否有該查詢結果,如果有則直接從緩存中讀取,如果沒有才訪問數據庫,這(this)樣可以(by)減少數據庫服務器的(of)訪問壓力。
當緩存區存滿時(hour),要(want)删除舊的(of)數據,添加新的(of)數據,因此緩存的(of)替換算法也是(yes)需要(want)考慮的(of)問題。在(exist)電商系統中,首頁中的(of)商品信息經常是(yes)最常用(use)的(of)商品信息,被訪問量最多的(of)數據要(want)長時(hour)間留在(exist)緩存中,因此緩存的(of)替換算法應用(use)最近最少使用(use)算法,最近最少使用(use)算法原理如圖3所示。
圖3 最近最少使用(use)算法
假如緩存區能存儲三個(indivual)數據,在(exist)數據沒有存儲滿時(hour),新數據會添加在(exist)緩存中。而在(exist)緩存存滿時(hour),若再去更新緩存,則會删掉最近最少使用(use)的(of)數據,更新後來(Come)有的(of)數據,圖4爲(for)更新緩存數據的(of)流程圖。
圖4 最近最少使用(use)算法流程圖
應用(use)最近最少使用(use)算法,能将長時(hour)間無人(people)查詢的(of)記錄删除,從而易于(At)插入新的(of)記錄。最近最少使用(use)算法是(yes)将每個(indivual)存儲值添加一(one)個(indivual)計數器的(of)标簽,當這(this)個(indivual)值被查詢或是(yes)更新時(hour)就同時(hour)更新對應的(of)計數器。因此,當緩存區滿時(hour),計數器中最低值将會被優先替換掉。
4.2.2多線程
高并發訪問是(yes)電商系統的(of)基本需求,由于(At)線程比進程更輕量,更少占有系統資源,切換代價更小,所以(by)Web應用(use)服務器都采用(use)多線程的(of)方式響應并發用(use)戶請求,因此本系統采用(use)多線程編程。
例如用(use)戶的(of)下單流程,對于(At)用(use)戶提交的(of)訂單請求,如果用(use)戶點擊提交訂單,則系統會自動調用(use)用(use)戶信息和(and)商品信息。調用(use)之後驗證該商品是(yes)否有貨,配送區域是(yes)否符合要(want)求等信息,而查驗的(of)用(use)戶信息是(yes)用(use)戶是(yes)否爲(for)遊客,用(use)戶的(of)id是(yes)否被禁用(use)等信息。隻有商品信息和(and)用(use)戶信息都驗證通過時(hour),系統才認爲(for)該訂單提交成功。
如果有一(one)項不(No)符合要(want)求則認爲(for)這(this)次訂單提交失敗。這(this)兩部分驗證無論先後都對判斷結果沒有影響,并且這(this)兩個(indivual)判斷相互之間不(No)影響,可是(yes)如果順序執行會降低效率,因此應用(use)多線程來(Come)處理業務邏輯内能并發處理的(of)事情,從而達到(arrive)提高效率的(of)目的(of)。如果未添加多線程,則程序按順序執行,該程序執行流程如圖5所示。其中,examineProduct()方法會檢驗商品庫存,商品配送區域是(yes)否滿足需求,而examineUser()方法則會驗證用(use)戶的(of)地(land)址,權限等是(yes)否符合要(want)求。因爲(for)這(this)兩部分的(of)驗證是(yes)互不(No)影響的(of),所以(by)将兩種方法并行處理,然後集中處理返回數據就會提高處理效率。
圖5 不(No)添加多線程處理的(of)流程圖
用(use)戶提交訂單後,如果采用(use)多線程的(of)處理方式,就可以(by)同時(hour)調用(use)兩種方法,不(No)過其内部處理的(of)順序是(yes)不(No)定的(of)。多線程處理用(use)戶提交訂單的(of)流程圖如圖6所示。其中用(use)戶數據的(of)獲取和(and)商品數據的(of)獲取是(yes)相對獨立的(of),對兩者用(use)多線程處理後的(of)結果進行判斷,可以(by)減少處理時(hour)間。對于(At)其他(he)如付款和(and)計算商品價格等流程也利用(use)到(arrive)多線程處理技術,提高系統的(of)處理效率。多線程處理是(yes)調用(use)jdk自帶的(of)Thread對象來(Come)完成,并且一(one)個(indivual)Thread有一(one)個(indivual)完整的(of)生(born)命周期,在(exist)處理完成後,線程會自動調用(use)desto⁃ry進行銷毀,不(No)會占用(use)系統資源。
4.3電商系統的(of)數據庫優化方案
4.3.1數據庫的(of)讀寫分離
電商系統的(of)用(use)戶大(big)部分是(yes)查看商品信息、浏覽推薦的(of)内容和(and)查看資料等讀的(of)内容。用(use)戶注冊,下單量比查詢量少得多。由于(At)數據庫壓力較大(big),所以(by)系統部署了(Got it)多個(indivual)數據庫來(Come)分擔請求。但爲(for)了(Got it)保持數據的(of)高效性和(and)一(one)緻性,僅設置了(Got it)單個(indivual)服務器進行寫入,其他(he)的(of)服務器則接受讀取的(of)操作(do)。其中負責寫入的(of)服務器稱爲(for)主服務器,其在(exist)一(one)定時(hour)間内将服務器中的(of)數據同步到(arrive)從服務器中。如圖7所示,本系統的(of)服務器利用(use)的(of)是(yes)master-slave模式,将數據庫服務部署在(exist)多台服務器上(superior),一(one)台master服務器專門負責數據的(of)寫入,而其他(he)服務器則負責返回業務邏輯層讀取的(of)數據。同時(hour),現有master服務器還會定時(hour)對另一(one)台master服務器進行備份,如果主服務器宕機,就立即啓用(use)備份服務器作(do)爲(for)主服務器。
圖6 添加多線程處理的(of)流程圖
圖7 數據庫讀寫分離
4.3.2創建索引
當數據庫執行操作(do)語句時(hour),一(one)般是(yes)根據條件進行全表掃描,每當遇到(arrive)匹配項時(hour),便将其添加到(arrive)搜索結果内;在(exist)已經針對某唯一(one)标識建立索引時(hour),查詢時(hour)會優先到(arrive)索引中定位符合條件的(of)記錄數,從而得到(arrive)所要(want)結果。這(this)樣可以(by)減少查詢的(of)記錄數從而大(big)幅提升查詢速度。建立索引是(yes)爲(for)了(Got it)提高數據庫查詢速度,但是(yes)索引的(of)建立和(and)存儲也會占用(use)一(one)定空間,修改表内數據時(hour)索引也要(want)進行相應的(of)維護,進而影響到(arrive)維護數據的(of)速度,通常在(exist)有以(by)下特征的(of)字段上(superior)建立索引:需要(want)頻繁和(and)快速查詢的(of)字段;建立了(Got it)主鍵或外鍵的(of)字段;定義了(Got it)排序規則的(of)字段;在(exist)檢索中需要(want)組合到(arrive)一(one)起的(of)字段。
4.3.3數據庫操作(do)語言的(of)優化
對于(At)關系型數據庫,通常需要(want)寫數據庫操作(do)語句來(Come)訪問所需數據,數據庫查詢效率是(yes)影響電商系統并發響應能力的(of)一(one)個(indivual)重要(want)因素,因此對數據庫操作(do)語句的(of)優化成爲(for)了(Got it)不(No)可少的(of)一(one)部分。對于(At)ORA⁃CLE數據庫中的(of)SQL優化原則,例如:将具有最大(big)限制的(of)條件放在(exist)where語句的(of)最後面,從而減少子句的(of)訪問次數;需要(want)使用(use)聯合查詢時(hour),對from後面的(of)各個(indivual)表應當選擇記錄條數最少的(of)表來(Come)作(do)爲(for)基礎表。本方案在(exist)研發過程中,利用(use)這(this)些原則對代碼中的(of)SQL語句進行了(Got it)優化,提高了(Got it)數據庫的(of)訪問速度。
4.4電商系統的(of)服務器優化方案
4.4.1圖片服務器分離
對于(At)電商系統的(of)Web服務器來(Come)說,不(No)管是(yes)Apache還是(yes)其他(he)容器,圖片是(yes)最消耗資源的(of),因此有必要(want)将圖片與頁面進行分離,部署獨立的(of)圖片服務器,甚至是(yes)多台服務器,從而減少高并發頁面訪問請求的(of)服務器系統壓力,并且可以(by)确保系統不(No)會因爲(for)圖片問題而崩潰,在(exist)圖片服務器和(and)應用(use)服務器上(superior),可以(by)進行不(No)同的(of)配置優化。
4.4.2服務器集群技術
對于(At)單台服務器的(of)Web系統來(Come)說,在(exist)高并發的(of)情況下,服務器的(of)處理能力和(and)I/O能力肯定會成爲(for)服務的(of)瓶頸,如果用(use)戶的(of)訪問超出(out)了(Got it)服務器能承受的(of)範圍,就可能出(out)現嚴重的(of)後果甚至宕機。可以(by)通過各種方法将單台服務器的(of)性能最優化,然而單台服務器的(of)性能有限,這(this)時(hour)就必須考慮服務器集群技術了(Got it)。服務器集群技術是(yes)将很多台服務器集中起來(Come)進行同一(one)服務,各台服務器之間可以(by)通過内部局域網進行相互通訊,在(exist)用(use)戶看來(Come)就像是(yes)隻有一(one)台服務器。集群可以(by)應用(use)多台計算機來(Come)進行并行計算,從而獲得非常高的(of)計算速度,也可以(by)用(use)多台計算機做備份,如果其中某台服務器出(out)現故障,那麽它所運行的(of)服務就會被其他(he)服務器替代,從而實現整個(indivual)電商系統的(of)高性能和(and)高可靠性。
5測試與應用(use)
本方案分别對優化前和(and)優化後的(of)電商系統進行壓力測試,選取并發量最高的(of)首頁index.jsp作(do)爲(for)測試頁面。測試指标包括響應時(hour)間、各種服務器的(of)CPU利用(use)率和(and)最高并發量。在(exist)3萬并發訪問的(of)情況下,優化前後各測試指标的(of)對比見表1。
由表1的(of)對比可知,電商系統在(exist)優化後各項指标都有明顯提升,其中響應時(hour)間減少約25%,各服務器的(of)CPU利用(use)率降低45%左右。另外,在(exist)優化前,由于(At)各服務器CPU利用(use)率已接近或達到(arrive)90%,由此可估計系統最高并發量爲(for)3萬左右;優化後經測試,在(exist)系統并發量爲(for)6萬時(hour),各服務器CPU利用(use)率接近90%,估計最高并發量爲(for)6萬左右。另外,在(exist)不(No)同并發數時(hour),負載均衡器F5和(and)Nginx對三台Web服務器分配的(of)session數見表2。
由表2中的(of)數據可知經過F5和(and)Nginx的(of)調度,負載是(yes)接近均衡分配的(of)。
本電商系統經多方面測試後上(superior)線應用(use)。在(exist)最近的(of)一(one)次大(big)型購物活動中,該系統承受住12萬人(people)次的(of)在(exist)線訪問,最高并發量爲(for)5萬人(people),此時(hour)Web應用(use)服務器的(of)CPU利用(use)率約爲(for)70%,應用(use)服務器CPU利用(use)率約爲(for)55%,數據庫服務器CPU利用(use)率約爲(for)60%。系統的(of)各部分功能運行正常,各個(indivual)服務器的(of)CPU利用(use)率不(No)超過80%,響應時(hour)間在(exist)2s左右,這(this)也驗證了(Got it)本方案可以(by)有效解決高并發問題。
6結語
本文設計了(Got it)一(one)個(indivual)高并發Web電商系統,分析并提供了(Got it)在(exist)高并發情況下的(of)優化方案。首先分析了(Got it)高并發Web電商系統的(of)響應時(hour)間過長,服務器負載壓力過大(big)和(and)系統易崩潰的(of)原因并提出(out)了(Got it)一(one)個(indivual)有效的(of)優化方案。從負載均衡、Web前端、後台程序、數據庫以(by)及服務器幾個(indivual)方面進行了(Got it)優化。與其他(he)高并發Web應用(use)系統相比,該系統具有可擴展性、高可用(use)性和(and)高可靠性等特點,并有效解決了(Got it)Web電商系統的(of)高并發難題。對類似高并發應用(use)系統的(of)優化具有重要(want)意義。另外,随着用(use)戶量的(of)持續增長,對電商系統的(of)要(want)求會越來(Come)越高,如何進一(one)步優化電商系統還有待研究。