透過ATS緩存配置看如何判斷HTTP資源是否可緩存方法論

      緩存有個大原則,就是在不影響用戶、不觸犯法律的前提下,儘量多的將資源緩存到本地。哪些HTTP資源可以cache哪些不能cache,ATS對可緩存性有一套系統的判斷機制,設置靈活,可以對全局進行配置也可以對個別資源單獨配置,可以針對單個url進行配置也可以針對文件後綴類型進行配置,可以對正常資源進行配置也可以對故障信息(狀態碼400以上)進行配置,可以對靜態資源進行配置也可以對動態資源單獨配置,現在就剖開看一下。
 

一、HTTP響應頭信息配置緩存級別

任何cache系統大多數資源都是通過HTTP頭信息來判斷是否可緩存的,ATS同樣如此,此頭信息的配置是資源是否cache的一個必要條件,並且根據頭部信息的情況將資源分爲3個級別,分別是:

  • 2、有明確的緩存生命週期,具體表現是響應頭裏有expires(到什麼時間過期)或者有Cache-Control:(max-age、no-cache),這種設置對用戶最負責任,不會出錯,我們線上ATS默認使用這個級別

  • 1、有Last-Modified頭或者有明確的緩存生命週期,這個級別就要鬆一些了,即使資源沒有明確的緩存週期,但是通過Last-Modified頭結合ATS自身的算法機制(引進了老化因子的概念)計算出緩存時間,對資源進行緩存,存多久看後面的第五條;

  • 0、在級別1的基礎上,對沒有明確頭部信息的資源,默認存入本地緩存,存多久見後面第五條,然後每次if-modified-since回源。

      具體對應的配置如下:

      proxy.config.http.cache.required_headers  0|1|2    (0是無要求,1是有Last-Modified頭或者有明確的緩存生命週期,2是有明確的緩存生命週期)

此爲ATS所有內容是否可緩存的必要不充分條件。 

 

二、動態內容是否緩存

ATS不會像人一樣通過理性判斷去確定資源是否爲動態,他對動靜態資源的判斷完全是依賴url特徵匹配,我們線上的默認配置是不緩存,對應的配置參數是:

      proxy.config.http.cache.cache_urls_that_look_dynamic   0|1  (0是不緩存,1是可緩存) 

 此爲動態內容ATS是否可緩存的必要不充分條件。

三、帶cookie的資源是否緩存

web2.0的網站中,很多資源帶有cookie,對於cookie的信息是否緩存,如何緩存才能不影響用戶質量考驗着cache系統的性能,ATS對於cookie的設置分5個級別:

      proxy.config.http.cache.cache_responses_to_cookies INT  0|1|2|3|4
 

  • 0、任何帶cookie的資源都不緩存;

  • 1、任何帶cookie的資源都緩存;

  • 2、只緩存是圖片的cookie資源;

  • 3、除了文本類型其餘的cookie資源都緩存。

  • 4、除了系統響應的沒有”Set-Cookie”或者有”Cache-Control:public”的文本類型其餘的cookie資源都緩存。(我們線上設備的默認配置級別)

 此爲cookie內容ATS是否可緩存的必要不充分條件。

四、故障信息是否緩存

所謂故障信息指的是源站返回的4XX、5XX等錯誤代碼,對於故障信息是否緩存是存在爭議的,ATS在處理上將故障信息分爲兩類,一類是帶有明確生命週期的故障,另一類是沒帶有生命週期的故障,配置的參數如下:

        proxy.config.http.negative_caching_enabled  0|1  (1對所有故障信息都緩存,0是隻緩存有明確生命週期的故障信息,線上默認使用的是0)

        proxy.config.http.negative_caching_lifetime   2s   (對有明確緩存生命週期的故障信息的緩存時間,可以根據時間時間設置,目前線上默認改爲2s 


五、對於請求頭、響應頭中無任何緩存說明的信息資源

   對於這種信息ats是通過proxy.config.http.cache.required_headers頭再加上默認時間指令來控制的,比如header頭設置的是0級別,就是說對於頭部信息設置最寬鬆的策略,這時一個請求,如果沒有Cache-control、expires、Last-Modified這些字段,但是有Last-Modified頭的話,是通過最小化因子計算緩存時間,對應指令和計算方式如下:

      proxy.config.http.cache.heuristic_lm_factor FLOAT 0.100000 (緩存時間=當前時間減Last-Modified時間*0.1

      對於連Last-Modified頭都沒有的信息,是通過默認存儲時間去計算的,這個nginx的判斷邏輯有點類似,不過nginx對於緩存與否是全部判斷了後再操作,但ats是存不存和存多久是分開的,哪怕存儲時間爲0也會存一下,這兩條指令如下:

      proxy.config.http.cache.heuristic_min_lifetime INT 3600

      proxy.config.http.cache.heuristic_max_lifetime INT 17280000

      單位是秒,也就是說對這種沒任何緩存說明信息的資源最小存3600秒,最大存17280000秒。

      其實對於線上環境這三條指令都是用不到的,因爲我們把header頭的級別設置爲了2。


      綜上所述:對於ats而言,存儲設置是很靈活的,可以對各類資源單獨設置,如果覺得還不夠還可以在cache.config(影響cache-control字段)對單個資源進行設置。當然每一環都是有邏輯的,我舉個例子,現在比如我想要對除了授權類型的所有資源進行強制緩存10天,而且緩存期間不回源,可以這麼設置:

traffic_line -s proxy.config.http.cache.cache_urls_that_look_dynamic -v 1

traffic_line -s proxy.config.http.cache.cache_responses_to_cookies -v 1

traffic_line -s proxy.config.http.cache.required_headers -v 0

traffic_line -s proxy.config.http.cache.heuristic_min_lifetime -v 8640000

traffic_line -s proxy.config.http.cache.heuristic_max_lifetime -v 8640000

traffic_line -s proxy.config.http.cache.heuristic_lm_factor -v 0.5

traffic_line -s proxy.config.http.cache.when_to_revalidate -v 3 

cache.config    url_regex=.*    scheme=http       ttl-in-cache=240h




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章