網頁效能、快取與 CDN

網頁快取(web caching)

想像你一再從一本住在城市另一頭的圖書館藏書影印同一頁。與其每次都跑一趟,你乾脆在桌上留一份影本。下次要用時,你直接讀自己那份——快得多,圖書館也不必再把書翻出來。網頁快取就是把這個想法用在網路上:當內容被取得時,會在靠近使用者的某處(瀏覽器裡、代理伺服器裡、CDN 邊緣伺服器裡)留一份副本,讓下一次對相同內容的請求,能由附近的副本回應,而不必一路回到原始伺服器。

為什麼幫助這麼大?兩件事主宰了網頁延遲:距離與往返次數。對另一個大陸上的伺服器發出請求,光是訊號來回就可能花上一百毫秒以上,而一個網頁通常由數十個分開的項目組成(HTML、圖片、腳本、字型),每個都可能是一次自己的往返。快取讓那趟長途短路。第一次取得是快取未命中(cache miss,副本還不在,必須取得並儲存——稱為快取填充 cache fill);之後的取得是快取命中(cache hit),由附近副本即時回應。其中的學問在於決定一份快取副本能維持有效多久,因為內容會改變。

為什麼重要:快取是讓網路又快又能擴展的最大槓桿。它降低使用者的延遲、降低原始伺服器(origin)的負載與頻寬成本,並讓一台小伺服器撐住龐大的觀眾。陷阱——也是大多數快取錯誤的來源——是過時(staleness):快取可能提供已經過期的副本。所以真實系統會把快取搭配新鮮度規則(一份副本可重用多久)與驗證(便宜地檢查所存副本是否仍是最新)。快取不會讓任何單一次往返變快;它是避免往返。頻寬與光速都沒變——你只是沒去跑那趟長途。

一個新聞網站的標誌圖片被取得一次後,快取在你的瀏覽器裡。當你點過十篇文章,每次都從你的磁碟讀取那個標誌——它完全沒有網路往返——而只有會變動的文章內文才會重新取得。

快取一次、重用多次:命中就省去回到原始伺服器的長途。

快取只對能安全重用的內容有幫助。真正個人化或每次都不同的資料(你的銀行餘額、一次性表單權杖)絕不能由共用快取提供,否則一個使用者可能看到另一人的資料。

又稱
caching快取暫存