想像一家公司在加州的 AWS 數據中心上託管一個網站,對於美國的用戶來說,載入可能需要 100 毫秒,但對於中國的用戶來說,載入則需要 3 到 4 秒。幸運的是,有一些策略可以最小化遠端用戶的請求延遲。在設計或構建全球範圍的系統時,您始終需要記住這些策略。
什麼是 CDN?#
CDN 或內容分發或交付網絡是現代和流行的解決方案,用於最小化從伺服器獲取靜態資產時的請求延遲。一個理想的 CDN 由一組分佈在全球的伺服器組成。因此,無論用戶距離您的伺服器有多遠,它始終會接近您的 CDN。因此,用戶不必從源伺服器獲取靜態資產,如圖像、視頻、HTML、CSS 和 JavaScript。用戶可以快速從 CDN 獲取這些文件的緩存副本。請記住,靜態資產的大小可能相當大,想想高清壁紙圖像。通過從附近的 CDN 伺服器獲取該文件,我們還節省了大量的網絡帶寬。
流行的 CDN#
雲服務提供商通常提供自己的 CDN 解決方案,因為它非常流行且易於與他們的其他服務集成。一些流行的 CDN 包括 Cloudflare CDN、AWS Cloudfront、GCP Cloud CDN、Azure CDN 和 Oracle CDN。
CDN 如何運作?#
CDN 是一組全球分佈的伺服器,為您的源伺服器緩存靜態資產。每個 CDN 伺服器都有自己的本地緩存,這些緩存應該保持同步。
CDN 緩存的填充有兩種主要方式,這使得推送和拉取 CDN 之間存在區別。
在推送 CDN 中,工程師必須將新文件或更新的文件推送到 CDN,並將它們傳播到所有 CDN 伺服器的緩存中。
在拉取 CDN 中,伺服器緩存是懶惰更新的。也就是說,當用戶向 CDN 伺服器發送靜態資產請求時,如果它沒有該資產,它將從源伺服器獲取該資產,將其緩存並發送給用戶。如果 CDN 在其緩存中有該資產,它將返回緩存的資產。
這兩種方法各有優缺點。在推送 CDN 中,開發人員需要更多的工程工作來確保資產始終是最新的。另一方面,拉取 CDN 需要較少的維護,因為 CDN 會自動從源伺服器獲取不在其緩存中的資產。拉取 CDN 的缺點是,它們不知道您是否決定更新,然後獲取這個更新的資產。因此,在某段時間內,拉取 CDN 的緩存在源伺服器上更新資產後將變得靜止。另一個缺點是,對拉取 CDN 的第一次請求總是需要一些時間,因為它必須前往源伺服器。
儘管存在缺點,拉取 CDN 仍然比推送 CDN 更受歡迎,因為它們更容易維護。
還有幾種方法可以減少靜態資產的延遲時間。例如,拉取 CDN 通常在緩存時為資產附加時間戳。它們通常默認只緩存資產最多 24 小時。如果用戶請求 CDN 緩存中的過期緩存,CDN 將重新從源伺服器獲取資產,並在有更新的情況下獲取更新的資產。另一種解決方案是緩存破壞,您可以使用與以前資產版本不同的唯一哈希或 E-tag 來緩存資產。
什麼時候不應使用 CDN?#
CDN 通常是減少靜態文件請求延遲的好服務,但對於大多數 API 請求則不然。然而,有一些情況您不想使用 CDN。
如果您的服務目標用戶位於特定地區,那麼使用 CDN 將沒有任何好處,因為您可以直接在那裡託管您的源伺服器。
如果提供的資產是動態和敏感的,CDN 也不是一個好主意。例如,您不想在處理金融或政府服務等敏感情況時提供靜態數據。
一個關於 CDN 的示例面試問題#
想像一下,您正在構建亞馬遜的產品列表服務,該服務向在線購物者的瀏覽器提供一組元數據和圖像,CDN 在以下設計中將適合哪裡?您可以在評論中留下您的答案。