ATS 6.2.1中缓存文件过期并不回源校验的“坑”
事先說明
標(biāo)題說是“坑”,并沒有說是“bug”,也就是多半是玩的姿勢不對。
線上問題
我司(lecloud)目前線上大小文件都是使用的ATS 6.2.1版本,昨天運(yùn)維反饋有文件超過緩存時(shí)間并不回源刷新,截圖如下:
現(xiàn)象就是:age超過max-age了,過期了不更新!
另外需要說的一點(diǎn)就是,源站是可以正常回源的。
復(fù)現(xiàn)現(xiàn)象并打印調(diào)試日志
我復(fù)現(xiàn)了上述現(xiàn)象,發(fā)現(xiàn)問題的確如此,而且重啟ATS之后,問題依舊。
這個(gè)問題,最本源的解決途徑,就是去分析ATS對該請求的具體執(zhí)行過程,特別是在判斷緩存對象的refreshness這一塊兒的判斷細(xì)節(jié)。按照這個(gè)思路,我打開records.config中的debug選項(xiàng),只過濾http.*相關(guān)的日志,traffic_line -x讓配置生效后, 重新觸發(fā)請求,得到了該請求完全的處理日志,我已經(jīng)上傳,參見下面的鏈接
https://download.csdn.net/download/tao_627/10845892
仔細(xì)分析該日志,與我最初的想法有些差異。我最初以為,這種情況下ATS回去回源校驗(yàn),發(fā)現(xiàn)源站的內(nèi)容沒有變化,得到源站的304響應(yīng),然后還是將緩存中的內(nèi)容返回給客戶端,此時(shí)Age值繼續(xù)增大。但是我仔細(xì)分析http請求的處理日志,發(fā)現(xiàn)并不是這樣,ATS直接查緩存,并且校驗(yàn)緩存中的內(nèi)容是refresh之后,就直接讀取緩存并返回響應(yīng)給客戶端了。
那么這里值得懷疑的地方,就只能鎖定在ATS對緩存object的refreshness的處理是否存在問題。
代碼定位
從日志中的行號指示,主要定位到如下幾個(gè)函數(shù)
注意這里
日志和代碼一一對應(yīng)上
可以看出,這里對緩存中一個(gè)document的freshness_limit的判斷非常重要,優(yōu)先考慮的是Cache-Control: s-maxage, 然后是max-age,如果沒有這兩個(gè)頭,就再考慮Expires頭,然后是Last-Modified/Date頭,使用Last-Modified和Date頭計(jì)算freshness_limit時(shí),會用到下面的加權(quán)因子proxy.config.http.cache.heuristic_lm_factor,默認(rèn)是0.10
freshness_limit = (date - last_modified) * 0.10
如果上面的http頭都沒有,直接使用配置值中的最小經(jīng)驗(yàn)值proxy.config.http.cache.heuristic_min_lifetime
freshness_limit = s->txn_conf->cache_heuristic_min_lifetime
s-maxage與max-age的唯一區(qū)別是,s-maxage僅僅應(yīng)用于共享緩存,而不應(yīng)用于用戶代理的本地緩存等針對單用戶的緩存。另外,s-maxage的優(yōu)先級要高于max-age.
上面的計(jì)算過程中,都使用到配置項(xiàng)proxy.config.http.cache.guaranteed_max_lifetime和proxy.config.http.cache.guaranteed_min_lifetime來限定一個(gè)緩存object的freshness_limit必須在這兩者之間,默認(rèn)配置情況下,也就是必須在一年以內(nèi)。
CONFIG proxy.config.http.cache.guaranteed_max_lifetime INT 31536000
?
原因定位
ATS的官網(wǎng)文檔
https://docs.trafficserver.apache.org/en/6.2.x/admin-guide/files/records.config.en.html
中有這個(gè)配置選項(xiàng)
proxy.config.http.cache.guaranteed_max_lifetime
默認(rèn)配置是一年,在一年內(nèi)會按照過期策略進(jìn)行回源。? 如果超過了, 在目前的配置下(恰好我們也是配置的1年)直接響應(yīng)。在當(dāng)前情況下,就會導(dǎo)致該資源永不過期。
解決方法
更新records.config文件,在末尾增加一行,將對象緩存時(shí)間最大設(shè)置為10年,或其它合適的值
CONFIG proxy.config.http.cache.guaranteed_max_lifetime INT 315360000
然后更新配置文件(不需要重啟ats)
/usr/local/ats/bin/traffic_line -x
可見,還是我們對ATS 6.2.1的新特性不熟,導(dǎo)致掉進(jìn)“坑”里了,屬于玩的姿勢不對。
?
總結(jié)
以上是生活随笔為你收集整理的ATS 6.2.1中缓存文件过期并不回源校验的“坑”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lua中正则表达式的坑
- 下一篇: 在Ubuntu 16.04.5 LTS上