程序員都應瞭解的 CDN 是什麼?

程序員都應瞭解的 CDN 是什麼?

作者 | 曾建

出品 | CSDN(ID:CSDNnews)

在互聯網有一個“8秒原則”,即如果有一個頁面的響應時間超過8秒,那麼大部分的用戶就會放棄加載,從而放棄使用該頁面或網站。淘寶,京東,蘇寧等電商每天都有成千上萬的訪問量,在618電商節,雙十一購物逛歡節更是具有數以萬計的秒殺活動,是什麼能夠支撐系統在如此高併發情況下還能正常運行?這就不得不提CDN了,CDN是什麼呢,讓我們一探究竟。

程序员都应了解的 CDN 是什么?

CDN是什麼?

CDN其全稱是Content Delivery Network,即內容分發網絡。

CDN是構建在網絡上的內容分發網絡,具備內容存儲和分發兩個關鍵要素。其基本原理是廣泛採用各種緩存服務器,將這些緩存服務器分佈到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工作正常的緩存服務器上,由緩存服務器直接響應用戶請求。

比如說,北京的用戶讓他訪問北京的節點,上海的用戶讓它訪問上海的節點,而不是北京的用戶訪問上海的節點,上海的用戶訪問北京的節點,這樣會極大增加用戶的訪問時長,及訪問的成本。通過就近訪問,加速用戶對網站的訪問,解決Internet網絡擁堵狀況,提高用戶訪問網絡的響應速度。

CDN就像網絡中的快遞小哥,把你網購的商品從最近的倉庫拿出並選擇最優的路線,並將包裹及時的送到指定收貨地點。

CDN就是扮演護航及加速的角色,使得每一個網絡請求能夠請求更快,時延更小,響應更快,帶來更為極致的用戶體驗。當我們在瀏覽器訪問一個頁面的時候,

程序员都应了解的 CDN 是什么?

CDN是如何發揮自己的作用呢?

主要有以下步驟,如圖:

程序员都应了解的 CDN 是什么?

1. 當用戶點擊網站頁面上的內容URL,經過本地DNS系統解析,DNS系統會最終將域名的解析權交給CNAME指向的CDN專用DNS服務器;

2. CDN的DNS服務器將CDN的全局負載均衡設備IP地址返回用戶;

3. 用戶向CDN的全局負載均衡設備發起內容URL訪問請求;

4. CDN全局負載均衡設備根據用戶IP地址,以及用戶請求的內容URL,選擇一臺用戶所屬區域的區域負載均衡設備,告訴用戶向這臺設備發起請求;

5. 區域負載均衡設備會根據用戶IP,訪問資源以及服務能力為用戶選擇一臺合適的緩存服務器提供服務;

6. 全局負載均衡設備把服務器的IP地址返回給用戶;

7. 用戶向緩存服務器發起請求,緩存服務器響應用戶請求,將用戶所需內容傳送到用戶終端。如果這臺緩存服務器上並沒有用戶想要的內容,那麼這臺服務器就向網站的源服務器請求內容,源服務器返回內容給緩存服務器,並根據用戶自定義的緩存策略判斷是否進行緩存,並返回給用戶。

程序员都应了解的 CDN 是什么?

對於程序員而言,需要了解哪些資源比較適合使用CDN進行加速呢?

我們都知道,一個完整的網頁資源包括CSS,JS,圖片,音頻,視頻和頁面等文件。JS、CSS、圖片、音頻和視頻等都是靜態文件,一個成熟的網站在上線過程中對靜態文件的變更是比較少的或是不會變更的,這些類型的文件是最適合使用CDN進行加速。通過CDN將這些靜態資源分發至全國各地的服務器節點,便可以實現從任何一個地方訪問網頁都可選擇最近的節點服務器進行下載資源。

頁面文件主要分為靜態頁面文件和動態頁面文件。像各大公司的官網首頁,退出頁面等一般都是靜態文件,靜態頁面文件的結構一般是不會改變的,主要做展示用,這類靜態頁面文件也很適合做CDN加速。動態頁面文件指的是頁面會根據服務器端返回的響應內容進行動態渲染,例如JSP,PHP文件等。這些頁面文件內容是動態獲取的,所以並不適合做CDN加速。因為網頁的內容是動態變化的,在服務器端存儲的內容有效期是比較短的,這樣在瀏覽器請求到CDN服務器上的內容後會總是以過期來處理,最終還是要向源站服務器發送請求,在這種情況下,CDN的存在就沒有意義了。

訪問瀏覽器頁面時,我們也可以按F12通過瀏覽器控制檯查看頁面資源的一些緩存配置。比如通過谷歌瀏覽器訪問百度網站(www.baidu.com),打開控制檯可以查看到頁面加載過程中請求的資源。選擇一個圖片資源並查看對應的頭部消息,如下圖所示:

程序员都应了解的 CDN 是什么?

返回消息中與緩存相關的字段有:Cache-Control、Etag、Expires、Last-Modifie、Pragma等,在這裡一一做解釋。

Expires: Sun, 03 Nov 2019 09:04:35 GMT;Expires為緩存過期時間配置,如果http響應報文中設置了Expires,在Expires過期之前,就可以避免和服務器之間的連接。此時,瀏覽器無需向瀏覽器發出請求,只需要自己判斷手中的材料是否過期就可以了,完全不需要增加服務器的負擔。

Cache-Control: max-age=0;Cache-Control為緩存控制,Cache-Control除了在響應中使用,在請求中也可以使用。控制緩存的開關,用於標識請求或訪問中是否開啟了緩存,使用了哪種緩存方式。Cache-Control常使用no-cache,no-store,max-age=delta-seconds等配置類型;no-cache為告知(代理)服務器不直接使用緩存,要求向源服務器發起請求。no-store為所有的內容都不會緩存,max-age為告知服務器客戶端希望接收一個存在時間不大於delta-seconds秒的配置資源。

Last-Modified: Mon, 10 Jun 2019 09:12:15 GMT;Last-Modified為當前文件版本的上一次修改時間,服務器為了通知瀏覽器當前文件的版本,會發送一個上次修改時間的標籤,這樣瀏覽器就知道他收到的這個文件創建時間。

Etag: "2046392041";對應實體內容的一個實體標籤,與實體內容緊密相關,實體內容發生任何改變都會使值發生變化。ETag是一個文件的唯一標誌符,就像一個哈希或者指紋,每個文件都有一個單獨的標誌,只要這個文件發生了改變,這個標誌就會發生變化。主要為了解決 Last-Modified 無法解決的一些問題。比如一些文件也許會週期性的更改,但是他的內容並不改變(僅僅改變的修改時間),這個時候我們並不希望客戶端認為這個文件被修改了,而重新請求;或者某些文件修改非常頻繁,比如在秒以下的時間內進行修改,(比方說1s內修改了N次),If-Modified-Since能檢查到的粒度是s級的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒),以及某些服務器不能精確的得到文件的最後修改時間等;

Pragma: no-cache;Pragma的值為no-cache時,表示禁用緩存;Pragma是舊產物,已經逐步拋棄,有些網站為了向下兼容還保留了這兩個字段。如果一個報文中同時出現Pragma和Cache-Control時,以Pragma為準。同時出現Cache-Control和Expires時,以Cache-Control為準。即優先級從高到低是 Pragma -> Cache-Control -> Expires。

當不使用CDN的時候,用戶在訪問網站的時候,瀏覽器將網站中的圖片和靜態資源文件保存到本地,這樣用戶再次訪問該網站的時候,瀏覽器就不用再下載全部的文件,減少了下載量,從而提高了頁面加載的速度。使用CDN後,將瀏覽器訪問服務器的中間增加一層CDN,瀏覽器訪問服務器時先檢查是否有本地緩存是否過期,如果過期,則向CDN邊緣節點發起請求,CDN邊緣節點會檢測用戶請求數據的緩存是否過期,如果沒有過期,則直接響應用戶請求;如果數據已經過期,那麼CDN還需要向源站發出回源請求,來拉取最新的數據。

瀏覽器緩存內容中有Expires或者Cache-Control設置了max-age響應頭的時候,瀏覽器就不會向服務器發起校驗請求,而是直接複用本地緩存。如果此時服務器進行了資源的更新,用戶就無法獲取到最新的資源,只能通過強制刷新瀏覽器緩存來跟服務器請求最新的資源。使用CDN緩存可以避免瀏覽器緩存資源更新延遲的現象。CDN緩存不僅可以減少用戶的訪問延時,而且可以減少源服務器的負載,但需要注意的是,當源服務器資源更新後,如果CDN節點上緩存數據還未同步,用戶訪問到的依舊是過期的緩存資源,這會導致用戶最終訪問出現偏差。此時需要手動刷新相關資源,使CDN緩存保持為最新的狀態。

瀏覽器以最少的請求來獲取網頁的數據,並對所有沒有過期的內容直接使用本地緩存,從而減少了對服務器的請求。使用CDN技術,最大的好處就是加速了網站的訪問速度,使用戶與內容之間的物理距離縮短,以及用戶的等待時間縮短,從而提高用戶的體驗。

作者:曾建,目前就職於蘇寧易購,專注於CDN相關係統開發。

聲明:本文系作者獨立觀點,不代表CSDN立場。

【End】

程序员都应了解的 CDN 是什么?

熱 文推 薦

☞ofo 退押金出新招;快手回應“棄拼多多聯手阿里”;Julia 1.3 發佈 | 極客頭條

☞信號問題可根除,蘋果新款 iPhone 將搭載高通基帶?

☞快速用 Haskell 構建超級簡單的 Web 技術棧!

☞拒絕成為比爾·蓋茨的“萬維網之父”,又要幹大事!

☞倪光南:中國 5G 有望成為世界第一

☞量子算命,在線擲筊:一個IBM量子云計算機的應用實踐,代碼都有了

☞從黑客文化看區塊鏈開源社區的自我組織與成功之道


分享到:


相關文章: