摘要:的優勢很明顯節點解決了跨運營商和跨地域訪問的問題,訪問延時大大降低大部分請求在邊緣節點完成,起到了分流作用,減輕了源站的負載。
CDN是什么?
談到CDN的作用,可以用8年買火車票的經歷來形象比喻:
8年前,還沒有火車票代售點一說,12306.cn更是無從說起。那時候火車票還只能在火車站的售票大廳購買,而我所住的小縣城并不通火車,火車票都要去市里的火車站購買,而從縣城到市里,來回就是4個小時車程,簡直就是浪費生命。后來就好了,小縣城里出現了火車票代售點,可以直接在代售點購買火車,方便了不少,全市人民再也不用在一個點苦逼的排隊買票了。
CDN就可以理解為分布在每個縣城的火車票代售點,用戶在瀏覽網站的時候,CDN會選擇一個離用戶最近的CDN邊緣節點來響應用戶的請求,這樣海南移動用戶的請求就不會千里迢迢跑到北京電信機房的服務器(假設源站部署在北京電信機房)上了。
CDN的優勢很明顯:(1)CDN節點解決了跨運營商和跨地域訪問的問題,訪問延時大大降低;(2)大部分請求在CDN邊緣節點完成,CDN起到了分流作用,減輕了源站的負載。
緩存是什么?
這里不深究CDN背后高大上的架構,也不討論CDN如何做到全局流量調度策略,本文著重討論在有了CDN后,數據是如何被緩存的。緩存是一個到處都存在的用空間換時間的例子。通過使用多余的空間,我們能夠獲取更快的速度。
首先,看看沒有網站沒有接入CDN時,用戶瀏覽器與服務器是如何交互的:
q111.png
用戶在瀏覽網站的時候,瀏覽器能夠在本地保存網站中的圖片或者其他文件的副本,這樣用戶再次訪問該網站的時候,瀏覽器就不用再下載全部的文件,減少了下載量意味著提高了頁面加載的速度。
如果中間加上一層CDN,那么用戶瀏覽器與服務器的交互如下:
q222.png
客戶端瀏覽器先檢查是否有本地緩存是否過期,如果過期,則向CDN邊緣節點發起請求,CDN邊緣節點會檢測用戶請求數據的緩存是否過期,如果沒有過期,則直接響應用戶請求,此時一個完成http請求結束;如果數據已經過期,那么CDN還需要向源站發出回源請求(back to the source request),來拉取最新的數據。CDN的典型拓撲圖如下:
q333.png
圖片來源:http://grefr.iteye.com/blog/2004248
可以看到,在存在CDN的場景下,數據經歷了客戶端(瀏覽器)緩存和CDN邊緣節點緩存兩個階段,下面分別對這兩個階段的緩存進行詳細的剖析
客戶端(瀏覽器)緩存
客戶端緩存的缺點
客戶端緩存減少了的服務器請求,避免了文件重復加載,顯著地提升了用戶地方。但是當網站發生了更新的時候(如替換了css、js以及圖片文件),瀏覽器本地仍保存著舊版本的文件,從而導致無法預料后果。
曾幾何時,一個頁面加載出來,頁面各元素位置亂飄,按鈕點擊失效,前端GG都會習慣性地問一句:“緩存清了沒?”,然后Ctrl+F5 ,Everything is OK。但有些時候,如果我們是簡單地在瀏覽器地址欄中敲一個回車,或者是僅僅按F5刷新,問題依然沒有解決,你可知道這三種不同的操作方式,決定瀏覽器不同的刷新緩存策略?
瀏覽器如何來確定使用本地文件還是使用服務器上的新文件?下面來介紹幾種判斷的方法。
瀏覽器緩存策略
Expires
Expires:Sat, 24 Jan 2015 20:30:54 GMT
q444.png
如果http響應報文中設置了Expires,在Expires過期之前,我們就避免了和服務器之間的連接。此時,瀏覽器無需想瀏覽器發出請求,只需要自己判斷手中的材料是否過期就可以了,完全不需要增加服務器的負擔。
Cache-control: max-age
q555.png
Expires的方法很好,但是我們每次都得算一個精確的時間。max-age 標簽可以讓我們更加容易的處理過期時間。我們只需要說,這份資料你只能用一個星期就可以了。
Max-age 使用秒來計量,如:Cache-Control:max-age=645672 指定頁面645672秒(7.47天)后過期。
Last-Modified
服務器為了通知瀏覽器當前文件的版本,會發送一個上次修改時間的標簽,例如:
Last-Modified:Tue, 06 Jan 2015 08:26:32 GMT
q666.png
這樣瀏覽器就知道他收到的這個文件創建時間,在后續的請求中,瀏覽器會按照下面的規則進行驗證:
在這種情況下,服務器僅僅返回了一個304的響應頭,減少了響應的數據量,提高了響應的速度。關于304響應,請參考:
http://www.cnblogs.com/ziyunfei/archive/2012/11/17/2772729.html
下圖是按F5刷新頁面后,頁面返回304響應頭。
q777.png
ETag
通常情況下,通過修改時間來比較文件是可行的。但是在一些特殊情況,例如服務器的時鐘發生了錯誤,服務器時鐘進行修改,夏時制DST到來后服務器時間沒有及時更新,這些都會引起通過修改時間比較文件版本的問題。
ETag可以用來解決這種問題。ETag是一個文件的唯一標志符。就像一個哈希或者指紋,每個文件都有一個多帶帶的標志,只要這個文件發生了改變,這個標志就會發生變化。
服務器返回ETag標簽:ETag:"39001d-1762a-50bf790757e00"
q888.png
接下來的訪問順序如下所示:
如同 Last-modified 一樣,ETag 解決了文件版本比較的問題。只不過 ETag 的級別比 Last-Modified 高一些。
額外的標簽
緩存標簽永遠不會停止工作,但是有時候我們需要對已經緩存的內容進行一些控制。
l Cache-control: public 表示緩存的版本可以被代理服務器或者其他中間服務器識別。
l Cache-control: private 意味著這個文件對不同的用戶是不同的。只有用戶自己的瀏覽器能夠進行緩存,公共的代理服務器不允許緩存。
l Cache-control: no-cache 意味著文件的內容不應當被緩存。這在搜索或者翻頁結果中非常有用,因為同樣的URL,對應的內容會發生變化。
q999.png
瀏覽器緩存刷新
瀏覽器以最少的請求來獲取網頁的數據,瀏覽器會對所有沒有過期的內容直接使用本地緩存,從而減少了對瀏覽器的請求。所以,Expires,max-age標記只對這種方式有效。
瀏覽器會在請求中附加必要的緩存協商,但不允許瀏覽器直接使用本地緩存,它能夠讓 Last-Modified、ETag發揮效果,但是對Expires無效。
這種方式就是強制刷新,總會發起一個全新的請求,不使用任何緩存。
CDN緩存
瀏覽器本地緩存失效后,瀏覽器會向CDN邊緣節點發起請求。類似瀏覽器緩存,CDN邊緣節點也存在著一套緩存機制。
CDN緩存的缺點
CDN的分流作用不僅減少了用戶的訪問延時,也減少的源站的負載。但其缺點也很明顯:當網站更新時,如果CDN節點上數據沒有及時更新,即便用戶再瀏覽器使用Ctrl +F5的方式使瀏覽器端的緩存失效,也會因為CDN邊緣節點沒有同步最新數據而導致用戶訪問異常。
CDN緩存策略
CDN邊緣節點緩存策略因服務商不同而不同,但一般都會遵循http標準協議,通過http響應頭中的Cache-control: max-age的字段來設置CDN邊緣節點數據緩存時間。
當客戶端向CDN節點請求數據時,CDN節點會判斷緩存數據是否過期,若緩存數據并沒有過期,則直接將緩存數據返回給客戶端;否則,CDN節點就會向源站發出回源請求,從源站拉取最新數據,更新本地緩存,并將最新數據返回給客戶端。
CDN服務商一般會提供基于文件后綴、目錄多個維度來指定CDN緩存時間,為用戶提供更精細化的緩存管理。
CDN緩存時間會對“回源率”產生直接的影響。若CDN緩存時間較短,CDN邊緣節點上的數據會經常失效,導致頻繁回源,增加了源站的負載,同時也增大的訪問延時;若CDN緩存時間太長,會帶來數據更新時間慢的問題。開發者需要增對特定的業務,來做特定的數據緩存時間管理。
CDN緩存刷新
CDN邊緣節點對開發者是透明的,相比于瀏覽器Ctrl+F5的強制刷新來使瀏覽器本地緩存失效,開發者可以通過CDN服務商提供的“刷新緩存”接口來達到清理CDN邊緣節點緩存的目的。這樣開發者在更新數據后,可以使用“刷新緩存”功能來強制CDN節點上的數據緩存過期,保證客戶端在訪問時,拉取到最新的數據。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125988.html
摘要:要錢的簡單理解百度的廣告就是不用錢的自己配置提高搜索引擎的權重是一種技術,主要是用于提高網站瀏覽量而做的優化手段為什么需要我們搜一下微信公眾號發現排名是有先后的,博客園都是靠前的。 CDN 什么是CDN 初學Web開發的時候,多多少少都會聽過這個名詞->CDN。 CDN在我沒接觸之前,它給我的印象是用來優化網絡請求的,我第一次用到CDN的時候是在找JS文件時。當時找不到相對應的JS文件...
摘要:要錢的簡單理解百度的廣告就是不用錢的自己配置提高搜索引擎的權重是一種技術,主要是用于提高網站瀏覽量而做的優化手段為什么需要我們搜一下微信公眾號發現排名是有先后的,博客園都是靠前的。 CDN 什么是CDN 初學Web開發的時候,多多少少都會聽過這個名詞->CDN。 CDN在我沒接觸之前,它給我的印象是用來優化網絡請求的,我第一次用到CDN的時候是在找JS文件時。當時找不到相對應的JS文件...
閱讀 3514·2023-04-25 20:09
閱讀 3720·2022-06-28 19:00
閱讀 3035·2022-06-28 19:00
閱讀 3058·2022-06-28 19:00
閱讀 3131·2022-06-28 19:00
閱讀 2859·2022-06-28 19:00
閱讀 3014·2022-06-28 19:00
閱讀 2610·2022-06-28 19:00