1. 程式人生 > >Web網站架構的高併發實現

Web網站架構的高併發實現

高效能的Web網站可以從Web前端、應用伺服器、程式碼優化、儲存的資料結構優化等4個方面考察。

Web前端效能優化

瀏覽器訪問優化

減少http請求

http是無狀態的應用層協議,意味著每次http請求都需要建立通訊鏈路、進行資料傳輸,而在伺服器端,每個http都需要啟動獨立的執行緒去處理。
減少http的主要手段是合併CSS、合併JavaScript、合併圖片等,這樣瀏覽器就只需要一次請求。

使用瀏覽器快取

CSS、JavaScript、Logo等靜態資源更新頻率都比較低,而這些檔案又幾乎是每次http請求都需要的,如果將這些檔案快取在瀏覽器中,可以極好地改善效能。

CDN加速

CDN(Content Distribute Network,內容分發網路)是部署在網路運營商的機房,使用者請求路由的第一跳就到達了CDN伺服器,當CDN中存在瀏覽器請求的資源時,從CDN直接返回給瀏覽器,加速使用者訪問速度,減少資料中心負載壓力。

反向代理

代理伺服器通過配置快取功能加速Web請求,當用戶第一次訪問靜態內容的時候,靜態內容就被快取在反向代理伺服器上,這樣當其他使用者訪問該靜態內容時,就可以直接從反向代理伺服器返回,加速Web請求響應速度,減輕Web伺服器負載壓力。

此外,反向代理也可以實現負載均衡的功能,提高系統總體處理能力,進而改善網站高併發的效能。

負載均衡可以是在應用層(http)實現,也可以在網路層(修改資料報的目標IP地址)和資料鏈路層(修改目標伺服器的mac地址)來實現。

應用伺服器效能優化

分散式快取

分散式快取指快取部署在多個伺服器組成的叢集中,例如不需要互相通訊的Memcached分散式快取。

訊息佇列

在不使用訊息佇列的情況下,使用者的請求資料直接寫入資料庫,在高併發的情況下,會對資料庫造成巨大的壓力,同時也使響應延遲加劇。
在使用訊息佇列後,使用者請求的資料傳送給訊息佇列後立即返回,再由訊息佇列的消費者程序從訊息佇列中獲取資料,非同步寫入資料庫。

訊息佇列具有很好的削峰作用:將短時間高併發產生的事務訊息儲存在訊息佇列中,從而削平高峰期的併發事務。

程式碼層次優化

資源複用

系統執行時,要儘量減少那些開銷很大的系統資源的建立和銷燬,比如資料庫連線、執行緒、複雜物件等。

從程式設計角度,資源複用主要有兩種模式:單例和物件池。

儲存效能優化

B+樹和LSM樹

資料庫多采用兩級索引的B+樹,樹的層次最多3層。因此可能需要多次磁碟訪問才能更新一條記錄。

目前許多NoSQL產品採用LSM樹作為主要資料結構。LSM樹可以看做是一個N階合併樹。資料寫操作(插入、修改、刪除)都在記憶體中進行,並且都會建立一個新紀錄,這些資料在記憶體中仍然是一棵排序樹。
當資料量超過設定的記憶體閾值後,會將這棵排序樹和磁碟上最新的排序樹合併。當這棵排序樹的資料量也超過閾值後,和磁碟上下一級的排序樹合併。

在讀操作時,總是從記憶體中的排序樹開始搜尋,如果沒有找到,就從磁碟上的排序樹順序查詢。LSM樹可以極大程度上減少磁碟的訪問次數,加快訪問速度。