簡介
現(xiàn)代的企業(yè)級或互聯(lián)網(wǎng)系統(tǒng)窟蓝,“分流”是必須要考慮的設計,分流所使用手段數(shù)量之多窖铡、涉及場景之廣疗锐,可能連它的開發(fā)者都未能完全意識到坊谁,常見的分流手段有:客戶端緩存、域名解析滑臊、傳輸鏈路口芍、內(nèi)容分發(fā)網(wǎng)絡、負載均衡雇卷、服務端緩存等
客戶端緩存
常見的緩存方式有兩種鬓椭,強制緩存
和協(xié)商緩存
,無論是強制緩存還是協(xié)商緩存关划,它們的原理都是在服務器對客戶端請求的響應中附帶一些條件小染,要求客戶端在遇到相同的請求時,先判斷一下是否滿足贮折,如果滿足裤翩,就直接用上一次服務器給予的響應來代替,不必重新訪問
強制緩存
HTTP的強制緩存對一致性問題的處理策略就如它的名字一樣调榄,十分直接踊赠,它會在指定的時間范圍內(nèi)假設資源的內(nèi)容和狀態(tài)一定不會被改變,在這個時間范圍內(nèi)每庆,會一直持有和使用該資源的本地緩存副本筐带,Http協(xié)議中有一下兩類Header實現(xiàn)強制緩存
- Expires
Expires: Mon,11 Nov 2019 08:36:00 GMT
- Cache-Control
如果Expires和Cache-Control同時存在,并且語義存在沖突缤灵,則會以Cache-Control為準
主要參數(shù)為s-maxage
伦籍,max-age
,publice
腮出,private
帖鸦,public
,no-cache
利诺,no-store
等
協(xié)商緩存
強制緩存是基于時效性的富蓄,而協(xié)商緩存是一種基于變化監(jiān)測的緩存機制剩燥,在一致性上會有比強制緩存有更好的表現(xiàn).
協(xié)商緩存有兩種變動檢查機制慢逾,分別是根據(jù)資源的修改時間進行檢查,以及根據(jù)資源唯一標識是否變化進行檢查灭红,它們都是靠一組成對出現(xiàn)的請求頭侣滩、響應頭來實現(xiàn)的
- Last-Modified和If-Modified-Since
Last-Modified
是服務端的響應頭,用于告訴客戶端這個資源的最后修改時間变擒。對于帶有這個響應頭的資源君珠,當客戶端需要再一次請求時,會通過If-Modified-Since
把之前收到的資源最后修改時間發(fā)送會服務端
如果此時服務端發(fā)現(xiàn)資源在該時間后沒有被修改過娇斑,就只要返回一個 304/Not Modified 的響應即可策添,無須附帶消息體材部,達到節(jié)省流量的目的,如下所示:
如果此時服務端發(fā)現(xiàn)資源在該時間之后有變動唯竹,就會返回 200/OK 的完整響應乐导,在消息體中包含最新的資源,如下所示:HTTP/1.1 304 Not Modified Cache-Control: public, max-age=600 Last-Modified: Wed, 8 Apr 2020 15:31:30 GMT
HTTP/1.1 200 OK Cache-Control: public, max-age=600 Last-Modified: Wed, 8 Apr 2020 15:31:30 GMT Content
- ETag和If-None-Match
HTTP 響應頭是資源的特定版本的標識符浸颓。這可以讓緩存更高效物臂,并節(jié)省帶寬,因為如果內(nèi)容沒有改變产上,Web 服務器不需要發(fā)送完整的響應棵磷。而如果內(nèi)容發(fā)生了變化,使用 ETag 有助于防止資源的同時更新相互覆蓋(“空中碰撞”)
ETag是HTTP中一致性最強的緩存機制晋涣,但是同時它也是性能最差的緩存機制仪媒,在每一次請求時,服務端都必須對資源進行哈希計算谢鹊,相比之下要比只是簡單獲取修改時間的方式规丽,開銷要大很多
域名解析
當在一個域名下配置多條不同的記錄時,權威域名服務器可以根據(jù)自己的策略來進行選擇撇贺,典型的應用是智能路線:根據(jù)訪問者所處的不同地區(qū)(譬如華北赌莺、華南、東北)松嘶、不同服務商(譬如電信艘狭、聯(lián)通、移動)等因素來確定返回最合適的記錄翠订,將訪問者路由到最合適的數(shù)據(jù)中心巢音,達到智能加速的目的
傳輸鏈路
- 減少請求數(shù)量
請求每次都需要建立鏈路進行數(shù)據(jù)傳輸,這些開銷很昂貴尽超,減少請求的數(shù)量可有效提高訪問性能官撼。常見的手段包括- 雪碧圖
- CSS、JS文件合并/內(nèi)聯(lián)
- 文段文檔
- 媒體(圖片似谁、音頻)內(nèi)聯(lián)
- 合并Ajax請求
- 擴大并發(fā)請求數(shù)
- 擴大并發(fā)請求
如果希望更快地加載大量圖片或其他資源傲绣,需要進行域名分片(Domain Sharding),將圖片同步到不同主機或者同一主機的不同域名上 - 啟用壓縮傳輸
啟用壓縮能夠大幅度減少需要在網(wǎng)絡上傳輸?shù)膬?nèi)容大小巩踏,節(jié)省網(wǎng)絡流量 - 按重要性調(diào)節(jié)資源優(yōu)先級
將最重要的秃诵、馬上就要使用的、對客戶端展示影響大的資源塞琼,放在HTML的頭部坯墨,以便優(yōu)先下載
內(nèi)容分發(fā)網(wǎng)絡(CDN)
內(nèi)容分發(fā)網(wǎng)絡(CDN)是一個互連服務器網(wǎng)絡胰蝠,可加快數(shù)據(jù)密集型應用程序的網(wǎng)頁加載速度男娄。CDN 可以表示內(nèi)容分發(fā)網(wǎng)絡或內(nèi)容分配網(wǎng)絡。當用戶訪問某個網(wǎng)站時牵咙,來自該網(wǎng)站服務器的數(shù)據(jù)必須通過互聯(lián)網(wǎng)傳輸?shù)接脩舻挠嬎銠C。如果用戶距離該服務器較遠攀唯,則加載大文件(例如視頻或網(wǎng)站圖像)將需要很長時間霜大。相反,如果網(wǎng)站內(nèi)容存儲在距離用戶較近的 CDN 服務器上革答,就可以更快到達他們的計算機战坤。
CDN 優(yōu)勢
- 加快頁面加載速度
如果您的頁面加載速度太慢,網(wǎng)站流量可能會減少残拐。CDN 可以降低跳出率并增加用戶在您網(wǎng)站上停留的時間 - 降低帶寬成本
帶寬成本是一筆巨大的開支途茫,因為每個傳入的網(wǎng)站請求都會消耗網(wǎng)絡帶寬。通過緩存和其他優(yōu)化溪食,CDN 可以減少原始服務器必須提供的數(shù)據(jù)量囊卜,從而降低網(wǎng)站所有者的托管成本 - 提高內(nèi)容可用性
同一時間的訪客過多或網(wǎng)絡硬件故障可能會導致網(wǎng)站崩潰。CDN 服務可以處理更多 Web 流量并降低 Web 服務器的負載错沃。此外栅组,如果一臺或多臺 CDN 服務器離線,其他運營服務器可以替換它們枢析,以確保服務不中斷 - 提高網(wǎng)站安全性
分布式拒絕服務(DDoS)攻擊試圖通過向網(wǎng)站發(fā)送大量虛假流量來關閉應用程序玉掸。CDN 可以通過在多個中間服務器之間分配負載來處理此類流量峰值,從而降低對原始服務器的影響
分發(fā)方式
- 主動分發(fā)(Push)
分發(fā)由源站主動發(fā)起醒叁,將內(nèi)容從源站或者其他資源庫推送到用戶邊緣的各個CDN緩存節(jié)點上 - 被動回源(Pull)
被動回源由用戶訪問觸發(fā)司浪,是全自動、雙向透明的資源緩存過程把沼。這種分發(fā)方式是小型站點使用CDN服務的主流選擇啊易,如果不是自建CDN,而是采用云廠商的CDN服務饮睬,則多數(shù)采用的就是這種方式
CDN的工作原理
內(nèi)容分發(fā)網(wǎng)絡(CDN)通過在多個地理位置建立一個入網(wǎng)點(PoP)或一組 CDN 邊緣服務器來工作租谈。這個分布在不同地理位置的網(wǎng)絡基于緩存、動態(tài)加速和邊緣邏輯計算的原則工作
負載均衡
負載均衡是在支持應用程序的資源池中平均分配網(wǎng)絡流量的一種方法捆愁。負載均衡器是位于用戶與服務器組之間的設備割去,充當不可見的協(xié)調(diào)者,確保均等使用所有資源服務器
均衡策略與實現(xiàn)
- 輪循均衡(Round Robin)
- 權重輪循均衡(Weighted Round Robin)
- 隨機均衡(Random)
- 權重隨機均衡(Weighted Random)
- 一致性哈希均衡(Consistency Hash)
- 響應速度均衡(Response Time)
- 最少連接數(shù)均衡(Least Connection)
服務端緩存
缺點
- 開發(fā)
引入緩存會提高系統(tǒng)復雜度牙瓢,因為要考慮緩存的失效劫拗、更新间校、一致性等問題 - 運維
緩存會掩蓋一些缺陷矾克,讓問題在更遠的時間以后,出現(xiàn)在距離發(fā)生現(xiàn)場更遠的位置上 - 安全
緩存可能會泄漏某些保密數(shù)據(jù)憔足,也是容易受到攻擊的薄弱點
優(yōu)點
- 緩解CPU壓力
把方法運行結果存儲起來胁附、把原本要實時計算的內(nèi)容提前算好酒繁、把一些公用的數(shù)據(jù)進行復用,這可以節(jié)省 CPU 算力控妻,順帶提升響應性能 - 緩解I/O壓力
把原本對網(wǎng)絡州袒、磁盤等較慢介質(zhì)的讀寫訪問變?yōu)閷?nèi)存等較快介質(zhì)的訪問,將原本對單點部件(如數(shù)據(jù)庫)的讀寫訪問變?yōu)榈娇蓴U縮部件(如緩存中間件)的訪問弓候,順帶提升響應性能
緩存屬性
- 吞吐量
緩存的吞吐量使用 OPS 值(每秒操作數(shù)郎哭,Operations per Second,ops/s)來衡量菇存,反映了對緩存進行并發(fā)讀夸研、寫操作的效率,即緩存本身的工作效率高低 - 命中率
緩存的命中率即成功從緩存中返回結果次數(shù)與總請求次數(shù)的比值依鸥,反映了引入緩存的價值高低亥至,命中率越低,引入緩存的收益越小贱迟,價值越低 - 擴展功能
緩存除了基本讀寫功能外姐扮,還提供哪些額外的管理功能,譬如最大容量衣吠、失效時間茶敏、失效事件、命中率統(tǒng)計缚俏,等等 - 分布式支持
緩存可分為“進程內(nèi)緩存”和“分布式緩存”兩大類睡榆,前者只為節(jié)點本身提供服務,無網(wǎng)絡訪問操作袍榆,速度快但緩存的數(shù)據(jù)不能在各個服務節(jié)點中共享胀屿,后者則相反
緩存風險
- 緩存穿透
如果查詢的數(shù)據(jù)在數(shù)據(jù)庫中根本不存在,緩存里自然也不會有包雀,這類請求的流量每次都不會命中宿崭,且每次都會觸及末端的數(shù)據(jù)庫,緩存就起不到緩解壓力的作用了才写,這種現(xiàn)象稱為緩存穿透 - 緩存擊穿
如果緩存中某些熱點數(shù)據(jù)忽然因某種原因失效了葡兑,譬如典型地由于超期而失效,此時又有多個針對該數(shù)據(jù)的請求同時發(fā)送過來赞草,這些請求將全部未能命中緩存讹堤,都到達真實數(shù)據(jù)源中去,導致其壓力劇增厨疙,這種現(xiàn)象被稱為緩存擊穿 - 緩存雪崩
在緩存中大批不同的數(shù)據(jù)在短時間內(nèi)一起失效洲守,導致這些數(shù)據(jù)的請求都擊穿緩存到達數(shù)據(jù)源,同樣令數(shù)據(jù)源在短時間內(nèi)壓力劇增 - 緩存污染
緩存污染是指緩存中的數(shù)據(jù)與真實數(shù)據(jù)源的數(shù)據(jù)不一致的現(xiàn)象