天天看點

了解什麼是CDN

了解什麼是CDN

前言

相信很多人在制作自己的第一個網站的時是很激動的。我們知道,在一個網站項目中,頁面裡經常會有許多 JavaScript 以及 CSS 的引用,如果是直接引用項目内檔案的話,他們可能是這樣的:

了解什麼是CDN

這種方式的優點是開發省力,釋出省力,對伺服器要求小,省錢,沒有具體公網接入需求。

然而如果你的網站裡面有很多圖檔或者視訊并且需要部署到公網上時,網站的通路速度一定會讓你倍感崩潰。就像下面這張圖?

了解什麼是CDN

這時候肯定會有推薦你使用 CDN 來加速網站裡的一些 JavaScript 和 CSS 檔案,如下所示:

了解什麼是CDN

其實上面的圖檔就已經使用到 CDN 了。那到底什麼是 CDN 呢?

在解釋什麼是 CDN 之前,我們先來看一個身邊非常常見的案例—— 網購。

京東自營與淘寶的購物體驗

相信現在應該沒有人沒用過淘寶和京東的,在說 CDN 之前我們先來說下我在淘寶和京東的購物體驗。下面是我在使用這兩個電商平台時的情況:

  • 在淘寶買第三方店家商品
  • 在京東購買自營商品

之前我在淘寶買了一個雷電3的擴充塢,發貨地是深圳,花了三天才到南京,如果收貨地是河南呢?新疆呢?我想時間就更長了。可是我在河南的同學在京東(自營)買了一個手機下午購買的第二天早晨就收到貨了(并不是給京東打廣告)。這是為什麼呢?

我們在用京東購物的時候,如果仔細觀察的話可以發現,京東自營會根據我們的收貨地點,在全國範圍内找離我們最近、送達最快的倉庫,比如我在南京下的訂單,他可能就會從上海甚至直接從南京發貨;如果是在洛陽下單可能就會從鄭州發貨。這樣做的好處就是不管我們在南京,還是烏魯木齊,我們的收貨時間會大大減少。CDN 就類似于京東建立的這種倉儲系統。

從網購到 CDN

不知道上面的描述是否清楚,這裡為了加深了解,我制作了下面的流程對比圖:

了解什麼是CDN

為了讓貨物更快的送到買家手中,京東建立了這種倉儲系統;類比到網絡中,為了讓使用者更快地加載網頁(可以了解為伺服器給浏覽器送頁面),CDN 橫空出世了。

CDN 的全稱是 Content Delivery Network,即内容分發網絡。其基本思路是盡可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使内容傳輸的更快、更穩定。通過在網絡各處放置節點伺服器所構成的在現有的網際網路基礎之上的一層智能虛拟網絡,CDN 系統能夠實時地根據網絡流量和各節點的連接配接、負載狀況以及到使用者的距離和響應時間等綜合資訊将使用者的請求重新導向離使用者最近的服務節點上(如下圖所示)。其目的是使使用者可就近取得所需内容,解決 Internet 網絡擁擠的狀況,提高使用者通路網站的響應速度。

了解什麼是CDN

從“直播”了解一些和 CDN 有關的名詞

從上面的描述中我們得知了 CDN 的作用以及大概原理,但是其中的細節并沒有展開來說。其實 CDN 的一些細節通常會和一些名詞聯系上,例如負載均衡、源站之類的。同樣的,我們以一個身邊的例子——“直播”——來講解這些和CDN有關的名詞。

我們知道,視訊其實是由一幀一幀的圖檔組成的,是以直播的時候我們收到的視訊畫面的流程可以近似了解為下面這樣?

了解什麼是CDN

然而事實是這樣的嗎?當然不是!一個主播怎麼可能隻有一個觀衆,是以應該是下面這樣?

了解什麼是CDN

上圖的方式是主播把相同的資料同時傳給多個不同的觀衆,這當然是非常愚蠢的方式,同樣的資料被傳了多次,主播端的瓶頸非常明顯,比如有1000個觀衆同時觀看的時候,主播端根本無法承擔這麼多的資料傳輸。

是以很容易想到的一個方式就是在主播和使用者之間增加一個性能非常強悍的伺服器充當中間人的角色,從伺服器把資料發給不同使用者,也就是下面這樣?

了解什麼是CDN

這裡的伺服器主要有兩個作用:1. 接收來自主播的資料(推流);2. 将收到的資料分發給使用者(分發)。

當然,如果這裡的伺服器性能過于強悍,那麼它除了可以執行推流和分發的作用外,還可以實作美顔、特效、鑒黃等功能。這時,這台伺服器就又多了一個身份——流媒體進行中心。

可是一台伺服器的性能也是有上限的,假設一台伺服器最多可以支援1000個使用者同時觀看的話,如果使用者數遠遠大于1000的話又該怎麼辦呢?相信讀到這裡的小夥伴一定都知道可以怎麼做了,沒錯,那就是再添加一層伺服器(叢集),如下圖所示?

了解什麼是CDN

在上圖中,伺服器0負責接收主播的視訊資料,然後傳遞給伺服器1、2、3……,然後再由這些伺服器分發給使用者。考慮到使用者之後有可能還會通路這些資料,是以他們就幹脆把資料在伺服器1、2、3……上都存儲了一份。

相關名詞

接下來我們從上面的描述中來了解一些概念。

負載均衡

當觀衆人數不太多的時候,例如總共隻有1000人,那麼是選擇讓某一台伺服器服務這1000人,還是3台伺服器分擔1000人,還是2台?機器也會有新舊之分,老機器隻能扛800數量,那要怎麼來配置設定呢?等等問題。這裡就需要有一個政策來做資源的配置設定。這個政策叫做:負載均衡。負載均衡通常可以利用重定向、反向代理等方式實作,常用的負載均衡算法有輪詢法、随機法、最小連接配接數法等(篇幅問題,這裡不再闡述)。

CDN 緩存

考慮到使用者之後有可能還會通路這些資料,是以他們就幹脆把資料在伺服器1、2、3……上都存儲了一份(最簡單的例子就是多個使用者可能會在不同的時間段通路同一張圖檔)。這個概念叫做:CDN 緩存。

回源、源站、邊緣節點

當配置設定到伺服器1的第一個觀衆進入時,伺服器1是沒有存儲資料的,它會向伺服器-0擷取資料,這個過程叫做:回源;相應的,伺服器-0被稱為:源站;伺服器1、2、3……這些負責内容分發的被稱為邊緣節點。

緩存命中/緩存命中率

觀衆請求的資料如果由CDN緩存提供,叫做緩存命中,所有使用者請求的緩存命中比例叫做緩存命中率,它是衡量CDN 品質的關鍵名額。

就近原則

一名新進入的觀衆會被配置設定到哪一台伺服器上呢?理論上,這台伺服器距離使用者的網絡鍊路越短、不跨網,資料的傳輸的穩定性就越好,這個叫做:就近原則。

CDN?對象存儲?

通過上面的介紹,我們知道 CDN 的主要目的就是為了加速通路,服務對象主要是直播、點播、網頁靜态檔案、小檔案等。這時候可能就會有人問了,為了加速一些小檔案的通路,我也會使用一些廠家的對象存儲服務,例如阿裡的 OOS,百度的 BOS 等。那對象存儲和 CDN 又有什麼差別呢?

的确,這兩者的目的其實都是加速使用者的通路,但是側重點完全不同。CDN 的重點在于分發,對象存儲的重點在于存儲。可以把對象存儲簡單了解為網盤,CDN 是高速公路。

以圖檔存儲為例,對象存儲是存圖檔的,CDN 是加速下載下傳圖檔的。是以在很多情況下,二者是配合使用的,目前這一套組合也已經成為網際網路應用的一個必不可少的組成部分。

使用 CDN 的好處

說了這麼多,如果隻是為了加速網站的通路速度,完全可以選擇其他方式,為什麼一定要用 CDN 呢?或者說,除了可以加速,CDN 還有什麼好處?

  1. 有利于搜尋排名。谷歌等搜尋引擎已經把網站通路速度作為一個結果排名的重要名額了。
  2. 網站不容易當機。其實這就和把雞蛋放在很多籃子裡是一個道理,多個伺服器分流之後,源站的壓力就會小很多。
  3. 減少托管成本。大多數伺服器的帶寬都是有限制的,分流之後不同的檔案被存放在不同的伺服器上,可以減少帶寬産生的費用。

怎麼使用 CDN

怎麼使用 CDN 是個比較難回答的問題,因為如果要自己搭建一套 CDN 服務難度非常大,但如果隻是想要使用的話,有很多大廠都有自己的 CDN 服務,不同廠家都有不同的收費标準和特性,這個就因人而異了,具體使用看各家的文檔即可。一般在 html 中使用的時候我會直接去 BootCDN 上複制粘貼下需要使用的庫。

One More Thing

雖然有句話叫做“凡是能通過怼硬體來實作的都别浪費時間做軟體優化”,但是從上面的解釋中我們也能得知,CDN 的能力和那些邊緣節點有很大關系,假設硬體投入已經飽和了,還有什麼方式可以加速整個通路流程呢?

壓縮傳輸資料!如果可以實作将傳輸過程中的資料更進一步的壓縮同時保持資訊不變,那傳輸過程中各個節點所需要承擔的壓力就會小很多了,自然而然就可以加速通路了。

我最喜歡的美劇之一《矽谷》講述的就是主人公 Richard 開發出的一種開創性的“通用壓縮算法”,并以此創業的故事。按照劇裡的描述,該算法可以改變已有的網際網路世界。遺憾的是該劇中的算法現實中并不存在,但這并不影響這是一部十分優秀的美劇,推薦每一個從事IT領域的人觀看。

最後

鑒于筆者能力有限,如果有什麼疑問或建議可以在評論區留言。新來的小夥伴不妨給個關注,你們的支援我前進的最大動力?