曾經見到知乎上有人問「爲何像facebook這類的網站須要上千個工程師維護?」,下面的回答多種多樣,但總結起來就是:一個高性能的web系統須要從無數個角度去考慮他,大到服務器的佈局,小到軟件中某個文件的實現,甚至於某個循環內的運算若是出現不嚴謹均可能致使全盤崩潰。php
上面提到web性能優化須要多個角度去考慮,咱們沒法考慮到全部的優化細節,但能夠從咱們已知的層面去優化,咱們就先從網絡層面提及。css
①網絡請求路徑:html
------------------------------------------------------------------------------------------------------------------------|web
(客戶端輸入URL定位符)→(DNS服務器尋找映射)→(進入服務器,處理數據)→(返回數據至客戶端)
緩存
在這個用例中咱們能夠很清晰的看出網絡請求到返回的過程,雖然很是抽象,但足夠咱們以他爲基礎來進行優化了。
性能優化
------------------------------------------------------------------------------------------------------------------------|服務器
1)負載均衡網絡
BOSS一次給了小明好多項任務,小明發現怎麼安排時間也作不完,因而乎他盯上了在旁邊偷偷看電影的小強,小強忽然以爲背後有一股涼氣,一回頭小明一臉壞笑看着他,「這幾個任務交給你,晚上請你吃飯,要否則...嘿嘿嘿」,小強雖然不情願,可是在小明的請求(要挾)下,只能服從。次日,小明順利的完成了任務,給小強買了袋辣條。
架構
在計算機上負載均衡也相似如此,咱們的大BOSS客戶端將請求發送至服務器,然而一臺服務器是沒法承受很高的併發量的,咱們就會將請求轉發到其餘服務器,固然真正的負載均衡架構並非由一臺server轉發的另外一臺server,而在客戶端與服務器端中間加入了一個負責分配請求的負載均衡硬件(軟件)。併發
DNS
名詞:DNS是客戶端發送請求中一個很是重要的中轉,他的做用是將用戶請求的URL映射爲具體的IP地址,全世界有13臺根服務器,但一般爲咱們進行域名解析的並非根服務器,而是直接訪問咱們的 LDNS(Local DNS Server),一般由網絡運營商維護。
最先的負載均衡就是利用搭建本地DNS服務器實現的,實現方式簡單易懂,爲同一個主機名分配多個映射 ,可採用輪循,隨機等方式分配請求。看上去沒什麼問題,可是在使用過程當中會發現,若是其中一個地址down機,咱們是沒法及時發現的,若是有用戶被分配到這個主機就會出現訪問失敗的情況,同時咱們也沒法判斷每一個server的負載,可能會出現,某個server幾乎閒置,另一個server負載壓力極高的狀況。
↗(進入服務器1,處理數據)↘
(客戶端輸入URL定位符)→(DNS服務器尋找映射)→(DNS分配請求) (返回數據至客戶端)
↘(進入服務器2,處理數據)↗
硬件設備
名詞:負載均衡器(Load Balancer),負載均衡器一般做爲獨立的硬件置於客戶端與服務器之間。
負載均衡設備擁有很是好的負載均衡性能,他擁有衆多的負載均衡策略(權重,動態比率,最快模式,最小鏈接數等),能夠保證以相對較優的方式分配請求,不過好的東西老是有代價的,那就是價格,一臺負載均衡器的售價每每高達十幾萬甚至幾十萬,許多企業並不肯意爲它買單。
反向代理
名詞:Nginx。高性能,輕量級,已經成了人們對Nginx的第一印象,Nginx可做爲HTTP服務器,在處理高併發請求的時候擁有比如今主流的Apache服務器更高的性能,同時Nginx也是一個優秀的反向代理服務器。
第一次聽到「反向代理」,可能有些陌生,但若是瞭解與之對應的正向代理就很好理解了,正向代理一般由客戶端主動連接,好比咱們的***方式就是使用正向代理,以達到間接訪問網站的目的,而反向代理在服務器端,無需主動連接,當咱們訪問擁有反向代理的網站時,實際訪問的是其反向代理服務器,而非真正的服務器,當請求到達反向代理服務器時,反向代理服務器再將請求轉發至服務器。反向代理是實現負載均衡的主流手段之一,一般使用Nginx等服務器搭建,Nginx一樣擁有衆多的分配策略,以保證平均分配壓力。
↗(進入服務器1,處理數據)↘
(客戶端輸入URL定位符)→(DNS服務器尋找映射)→(反向代理服務器) (返回數據至客戶端)
↘(進入服務器2,處理數據)↗
Nginx反向代理: BIGIP(硬件)負載均衡:
2)CDN
視頻總在緩衝,圖片各類加載不出來,幾年前是再正常不過的事了,在當時你們也沒以爲是回事,但把這種狀況放在如今,我想人們絕對直接就小紅叉了吧,那麼咱們如何避免這樣的狀況呢?這就是我要說的,內容分發網絡(Content Delivery Network),簡稱:CDN。
CDN簡單的來講就是存儲一些靜態文件的一臺或多臺服務器,經過複製,緩存等方式,將文件保存其中。
1.哪些是靜態文件?
css,html,圖片,媒體都屬於靜態文件,也就是說用戶發送的請求不會影響靜態文件的內容,而jsp,php等文件就不屬於靜態文件,由於他們的內容會因咱們的請求而發生改變。
2.CDN如何實現加速?
一般狀況下,咱們所要的數據都是從主服務器中獲取,但假如咱們的主服務器在南方,而訪問用戶在北方,那麼訪問速度就會相對變慢,變慢的緣由有不少,例如傳輸距離,運營商,帶寬等等因素,而使用CDN技術的話,咱們會將CDN節點分佈在各地,當用戶發送請求到達服務器時,服務器會根據用戶的區域信息,爲用戶分配最近的CDN服務器。
3.CDN數據從哪裏來?
複製,緩存,CDN服務器能夠在用戶請求後緩存文件,也能夠主動抓取主服務器內容。
分佈在各地的CDNS: