事先说明

标题说是“坑”,并没有说是“bug”,也就是多半是玩的姿势不对。

线上问题

我司(lecloud)目前线上大小文件都是使用的ATS 6.2.1版本,昨天运维反馈有文件超过缓存时间并不回源刷新,截图如下:

现象就是:age超过max-age了,过期了不更新!

另外需要说的一点就是,源站是可以正常回源的。

复现现象并打印调试日志

我复现了上述现象,发现问题的确如此,而且重启ATS之后,问题依旧。

这个问题,最本源的解决途径,就是去分析ATS对该请求的具体执行过程,特别是在判断缓存对象的refreshness这一块儿的判断细节。按照这个思路,我打开records.config中的debug选项,只过滤http.*相关的日志,traffic_line -x让配置生效后, 重新触发请求,得到了该请求完全的处理日志,我已经上传,参见下面的链接

https://download.csdn.net/download/tao_627/10845892

仔细分析该日志,与我最初的想法有些差异。我最初以为,这种情况下ATS回去回源校验,发现源站的内容没有变化,得到源站的304响应,然后还是将缓存中的内容返回给客户端,此时Age值继续增大。但是我仔细分析http请求的处理日志,发现并不是这样,ATS直接查缓存,并且校验缓存中的内容是refresh之后,就直接读取缓存并返回响应给客户端了。

那么这里值得怀疑的地方,就只能锁定在ATS对缓存object的refreshness的处理是否存在问题。

代码定位

从日志中的行号指示,主要定位到如下几个函数

注意这里

日志和代码一一对应上

可以看出,这里对缓存中一个document的freshness_limit的判断非常重要,优先考虑的是Cache-Control: s-maxage, 然后是max-age,如果没有这两个头,就再考虑Expires头,然后是Last-Modified/Date头,使用Last-Modified和Date头计算freshness_limit时,会用到下面的加权因子proxy.config.http.cache.heuristic_lm_factor,默认是0.10

freshness_limit = (date - last_modified) * 0.10

如果上面的http头都没有,直接使用配置值中的最小经验值proxy.config.http.cache.heuristic_min_lifetime

freshness_limit = s->txn_conf->cache_heuristic_min_lifetime

s-maxage与max-age的唯一区别是,s-maxage仅仅应用于共享缓存,而不应用于用户代理的本地缓存等针对单用户的缓存。另外,s-maxage的优先级要高于max-age.

上面的计算过程中,都使用到配置项proxy.config.http.cache.guaranteed_max_lifetime和proxy.config.http.cache.guaranteed_min_lifetime来限定一个缓存object的freshness_limit必须在这两者之间,默认配置情况下,也就是必须在一年以内。

CONFIG proxy.config.http.cache.guaranteed_max_lifetime INT 31536000

原因定位

ATS的官网文档

https://docs.trafficserver.apache.org/en/6.2.x/admin-guide/files/records.config.en.html

中有这个配置选项

proxy.config.http.cache.guaranteed_max_lifetime

默认配置是一年,在一年内会按照过期策略进行回源。  如果超过了, 在目前的配置下(恰好我们也是配置的1年)直接响应。在当前情况下,就会导致该资源永不过期。

解决方法

更新records.config文件,在末尾增加一行,将对象缓存时间最大设置为10年,或其它合适的值
CONFIG proxy.config.http.cache.guaranteed_max_lifetime INT 315360000
然后更新配置文件(不需要重启ats)
/usr/local/ats/bin/traffic_line -x

可见,还是我们对ATS 6.2.1的新特性不熟,导致掉进“坑”里了,属于玩的姿势不对。

ATS 6.2.1中缓存文件过期并不回源校验的“坑”相关推荐

  1. ATS中的ComboHandler合并回源插件调研

    介绍 该插件提供了一种智能方式来将多个URL复合为一个URL,从而将原来的多个响应合并为一个单一的响应.这非常有用,比如说,将多个CSS或js文件合并为一个文件. 源码 目前git中的最新源码已经将c ...

  2. CentOS 6.3 64bit上测试ATS 5.3.0中的正则刷新插件regex_revalidate

    注意到ATS源码目录plugin/experimental/下面有regex_revalidate插件目录,我们在编译时添加--enable-experimental-plugins配置项就可以将其编 ...

  3. ATS 5.3.0中开启最高级别的缓存调试信息

    近来在pptv,letv之类的站点响应中看到via头中有非常详细的缓存信息,我研究了一下,原来是ATS默认就支持的,以ATS 5.3.0中为例,修改records.config中的如下配置项: CON ...

  4. ATS 5.3.0中利用grep得到纯净的配置文件

    ATS 5.3.0中的配置文件通常会标有详细的注释,但是我们有时候需要纯净的配置文件,特别是在线上部署的配置文件,不需要这么详细的注释.下面是处理过程. cat records.config | gr ...

  5. ATS 5.3.0中parent.config配置文件解读

    该博文翻译自参考文献[1] parent.config parent.config文件识别用在缓存分级中的父代理,用这个文件去执行下面的配置: 搭建父分级缓存,兼容多父级缓存和父级缓存故障转移 配置指 ...

  6. ATS 5.3.0中自定义日志格式文件logs_xml.config解读

    缘起 近来因为公司项目需要,阅读了一部分ATS logging system的源码实现,越发觉得logs_xml.config文件的配置非常重要,而我目前只是实践了一点它的皮毛.为此,根据自己的理解, ...

  7. ATS 5.2.1中Background-Fetch插件调研笔记

    简介 这是Apache Traffic Server(简称ATS)中的一个插件, 允许你从源站主动获取Object内容并填充到缓存中, 当你的所有或是大部分client request都是byte-r ...

  8. Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期

    本文以面试问题「Redis 中的过期元素是如何被处理的?」为切入点,用视频加图文的方式和大家聊聊 Redis 过期元素被处理的相关知识点. 涉及的知识点 过期删除策略有哪些? 这些过期策略有哪些优缺点 ...

  9. ASP.NET缓存中Cache过期的三种策略

    ASP.NET缓存中Cache过期的三种策略 原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. ...

最新文章

  1. 计算机视觉开源库OpenCV之边缘检测cv2.canny()函数
  2. H5 Canvas刮刮乐
  3. gradle镜像配置:使用阿里云仓库服务的代理仓库地址代替jcenter()、mavenCentral()及google()
  4. Panabit安装(二、Panabit安装)
  5. (六)Netty网络编程应用实例-群聊系统
  6. 随想录(我熟知的几个实时操作系统)
  7. Using Java in Debian
  8. 计算机核心期刊加拿大,ssci或cssci期刊北京大学图书馆版核心期刊国外学术.doc...
  9. PS教程新手入门(一)--去除图片上文字的方法(6种)
  10. winXP和win2003双系统下启动NTDETECT错误解决方法
  11. 广东第一高中生_广东高中排行榜TOP10,有你的母校吗?
  12. iPhone升级系统 死机了怎么办
  13. Mybatis(1)——Mybatis Generator自动生成代码
  14. 什么是案例管理模型和符号(CMMN)
  15. sws浏览器_快讯 | SWS入围2019英国SBID国际设计大奖
  16. PCA,LDA的C++实现(内附代码~)
  17. 学习笔记整理:网络应用技术-计算机网络概论
  18. ECO-PASSPOET认证辅导,Eco-Passport证书有效期为多久,到期是否需要重新缴纳费用
  19. Android 9.0实现系统内录(只录制系统声音)
  20. [蓝牙 Mesh Zephyr]-[003]-加入 Mesh 网络

热门文章

  1. 2022-2028年中国免疫诊断行业市场前瞻与投资战略规划分析报告
  2. Python 源码函数格式带有*和/说明
  3. Delphi 之Copyrect的使用
  4. js里的匿名函数 数组排序
  5. Google Chrome(谷歌浏览器) 发布下载
  6. ORB_SLAM2中的Sim3变换
  7. mysql 数据表 时间自动_MySQL数据库时间设置自动添加时间和自动更新时间
  8. 锁定计算机的事件日志,关闭并重新启动计算机后意外地在系统事件日志中记录了事件 ID 6008...
  9. 用法 stl_51Nod 2160 数字游戏 STL基本用法
  10. pyqt怎么给字体加粗_微信拍一拍可设置后缀?怎么用?还有更多新功能!