【CDN 最佳實踐】獲取曆史髒數據的處理思路及規避方法
在添加 CDN 後客戶端訪問經常出現訪問到曆史舊數據的情況,下麵我們分析客戶端到服務器端整條鏈路的情況分析出現曆史舊數據的原因以及規避方法。
客戶端瀏覽器緩存
現象分析
如解密瀏覽器緩存機製中所述,瀏覽器緩存是包括強緩存和驗證緩存兩種模式。因為強緩存是不會與服務器端進行任何校驗直接加載資源,因此客戶端訪問加載了強緩存的數據會直接導致獲取到曆史舊數據(如圖 1 所示)。
圖1. 瀏覽器強緩存示意圖
而如果客戶端獲取的瀏覽器驗證緩存也同樣是有可能獲取到曆史髒數據的。因為瀏覽器端會和其訪問資源的服務器端進行 Etag 或者 Last-Modified 字段驗證,如果其訪問的服務器為緩存服務器(例如: CDN 等緩存服務器)。而同樣緩存服務器也是曆史髒數據的話就會導致異常(如圖 2 所示)。
圖2. 瀏覽器驗證緩存示意圖
規避方案
1. 客戶端清空瀏覽器緩存
當懷疑瀏覽器強緩存導致的問題可以手動清空下瀏覽器緩存或者通過 Ctrl+F5 強製刷瀏覽器緩存查看是否恢複。
2. 禁止瀏覽器緩存
上述方法僅能夠臨時解決,如果該資源不想其因為瀏覽器緩存導致髒數據的話可以設置該資源的 Response 頭中的 Cache-Control 或者 Expires 為 no-cache, no-store, private即可禁止瀏覽器緩存。
注意:上述的 Response 頭中的 Cache-Control 或者 Expires 設置也同樣會影響 CDN 的緩存。如果希望 CDN 加速的資源可以在 CDN 上緩存但是禁止在瀏覽器緩存的話可以在 CDN 上設置 HTTP 頭,該 HTTP 頭不影響 CDN 緩存策略,僅影響客戶端瀏覽器緩存策略(配置如圖 3 所示)。
圖3. CDN 設置 HTTP 頭示意圖
劫持訪問到緩存服務器
現象分析
終端設備正常請求應該是到緩存服務器 CDN 或者服務器上,但是有時會出現該資源請求被 301 或者 302 跳轉到某台服務器返回數據,例如圖 4 所示,該 IP 並非是服務器的 IP ,被跳轉到運營商的緩存服務器。 這種現象一般出現在局部地區的個別終端設備中,並非在全局範圍內影響。
圖4. 訪問出現劫持示意圖
規避方案
1. 反饋當地運營商跟進該問題
因為該問題主要在客戶端到服務器端的運營商鏈路出現的問題,通過服務器端不好解決該問題,建議可將該問題反饋給運營商解決該問題。
CDN 緩存曆史髒數據
現象分析
CDN 作為內容分發網絡,是會將用戶源站的資源緩存到各個 CDN 節點。 CDN 當源站做同名更新時是不會主動回源拉取新資源的( OSS 除外,詳細見規避方案 4 )。除非當客戶端發起請求後,對應 CDN 節點上該資源沒有緩存或者緩存已經過期才會回源拉取最新的數據。
用戶可以通過獲取資源的 Response 頭中查看到該資源的緩存情況。如圖 5
中所示, Via 投中分別標識了 CDN 的 L2 節點和 L1 節點,如果兩者之中有一個是 "H" 的狀態即表示 CDN 是命中狀態,此時是不會回源拉取最新數據的。圖 5 中即是 CDN L2 節點命中的狀態。
圖5. CDN 的Response 頭示意圖
規避方案
1. 手動刷新 CDN 緩存,重新觸發回源請求
如果需要將 CDN 上的緩存強製置為過期的話是可以手動刷新 CDN 上的緩存數據的,詳細操作請您參考 CDN 刷新緩存,另外如果應用端需要腳本進行控製的話可以使用刷新的 API 接口,請您參考 CDN 刷新緩存接口。
注意: CDN 的目錄刷新是會刷新該目錄下的所有子目錄和文件的,因此目錄刷新是有可能引起大量回源請求的。
2. 源站盡量避免同名更新,可以給文件增加版本號區別
建議用戶靜態資源做版本更新的時候可以通過版本號進行區別,例如在 URL 中帶上 “?version=1.0” 進行區分,這樣避免應用係統迭代後仍然獲取之前版本數據。
注意:通過版本號進行區別時 CDN 是不能開啟過濾參數或者保證版本的參數保留的,請您參考: CDN 過濾參數的作用。
3. 資源經常同名更新則應該設置其不在 CDN 緩存
如果對應的資源經常需要更新的話那麼該資源應該在 CDN 緩存時間較短或者不緩存的,建議用戶可以根據實際的業務場景配置緩存規則, CDN 的緩存規則建議參考: CDN 緩存策略。
4. 當 CDN 的源站為 OSS 時可以設置自動刷新功能
當 CDN 的源站是 OSS 的話是可以設置自動刷新功能的,請您參考圖 6 。當 CDN 的加速域名也同樣在 OSS 的自定義域名進行綁定後即可開啟該自動刷新功能。然後當 OSS 中的文件出現同名更新的話就會自動下發 CDN 刷新任務以保證 CDN 上該資源的緩存不可用。
圖6. OSS 配置 CDN 緩存自動刷新示意圖
代理服務器緩存
現象分析
常見的用戶架構中是 CDN 回源到反向代理服務器,然後通過反向代理到真正的源站服務器。在這種場景下如果反向代理服務器開啟了緩存功能也同樣會在源站服務器進行更新後仍然出現曆史髒數據。測試通過代理服務器和源站服務器返回數據不一致即可確認為該問題。
規避方案
1. 關閉代理服務器的緩存功能
反向代理服務器的緩存功能用戶是可以選擇是否開啟緩存功能。例如使用 Nginx 服務器作為反向代理服務器時是通過 proxy_cache 模塊設置緩存的。用戶可以關閉該模塊功能即可取消緩存的功能,其他的 Web 服務器配置具體見對應服務器的官方配置文檔。
2. 清空代理服務器緩存
用戶在更新過源站服務器後可以清除代理服務器的緩存內容,不同的代理服務器有不同的清除方法,在 Nginx 服務器中是沒有直接提供清除指定 URL 緩存的功能的,常見的方法是使用 ngx_cache_purge 第三方模塊進行清理。
最後更新:2017-08-13 22:47:51
上一篇:
網狐棋牌6603源碼 專用數據庫減肥特效腳本
下一篇:
Logstash詳解之——input模塊
Exception in thread "taskExecutor-4" java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProx
jdk1.5和jdk1.6對於@override支持的區別
可視化丨福爾摩斯探案集的數據分析
使用 chroot 監獄限製 SSH 用戶訪問指定目錄
節約時間就是在節約成本,程序員如何提高工作效率
微模塊數據中心的益處
《Spring Boot官方指南》-30.1 redis
Linux字符設備驅動編寫流程
【雲端起舞】在Oracle公有雲上創建克隆數據庫
Spring MVC注解(Annotations)書目錄