最近网站做推广,预期访问量将会增加20倍左右(原来PV在10亿左右),其中大部分是静态页面,也有ajax动态请求。我们采取了如下策略。

机器扩容到原来的2倍

所有静态内容都加上CDN缓存

所有的动态请求都利用缓存定时更新机制,实现动态内容静态化。

在灰度放量初期,我们观察JS回源的请求,发现CDN并没有如期挡住请求,单台机器每分钟去到1万左右。找运维人员反复沟通,都说CDN没有问题。运维,开发的一场撕逼大战即将展开。

经过各种抓包分析排查,发现前端人员利用了Jquery的JSONP功能,会在每个动态请求发出前在的URL后面加时间戳,后面找运维人员沟通得知,CDN厂商在设置缓存的时候对于Key有两种策略,一种是按照文件名,将问号后面的参数去掉。另外一种是将所有的参数作为缓存Key的一部分。 然而,CDN默认为第二种。由于这个动态时间戳在业务上来说其实是没有用的,因此,果断让前端人员去掉。

然而,事情解决有这么顺利吗? 答案是,No。 经过几天的观察发现回源情况有所缓解,但是回源的请求依然很高。运维组给出的答案是我们的缓存时间设置过短(30s),好吧,我们不得已答应将缓存过期时间调整为1分钟,可是情况依然不乐观,直到后面的有了新发现。

在我们继续观察中发现一个奇怪的问题,那就是F5刷新每次不到几秒就会返回http 200,而理论上来说我们设置的缓存是1分钟,只要在1分钟的周期内,应该所有的内容都要返回304才对。运维同学们也反复观察发现一个问题,CDN如果回源更新内容的时候,我们会在http header 上 默认带上etag, etag是http1.1的内容,可以比expired time更精准的把控内容的变化,只要内容有任何更新,etag都会不同。可以查看[RFC](http://tools.ietf.org/html/rfc7232#section-2.3)的详细介绍。

An entity-tag can be more reliable for validation than a modification

date in situations where it is inconvenient to store modification

dates, where the one-second resolution of HTTP date values is not

sufficient, or where modification dates are not consistently

maintained.

后面运维人员发现CDN是这样工作的。

1.根据请求过来的Key去查找缓存,没有则回源

2.如果有则判断浏览器传过来的etag,与缓存里面的etag作比对,如果发现不同就去回源更新。如果相同就返回状态码304来减少网络传输。

问题就在第2点,只要CDN回源更新了就会导致浏览器的etag与CDN持有的etag不同,而CDN发现etag不匹配就去回源,而回源的结果就是etag又一次的更新,而其他用户的浏览器持有的etag又不同,周而复始,导致回源率特别高。

其实说到这里才来到了正题,按照etag的规范,服务器判断etag是否同客户端传来的etag匹配,如果不匹配则返回新的内容,负责返回304告诉浏览器原来的内容依然有效。实际上与etag类似的header还有if-modified-since, 但是按照协议规范etag会优先启用。但是在这里CDN发现不匹配原本应该认为自己的版本是最新的,但是CDN居然认为自己的内容不新了需要去回源了,个人认为这是CDN需要改进的地方。 既然etag导致了这个问题,去掉了也不会影响,因为还有if-modified-since,所以再一次然运维将整个站点的etag头都去掉了。 过几分钟观察,回源情一直下降,最后下降到几十个。

我这里标题是 CDN 回源之罪魁祸首-etag, 实际上能不能怪etag呢? 虽然有文章对这个header作批判的,但是我不认为是etag的问题,而是CDN值得改进。这里记录下这个过程是想让看到的同学们避免踏入这个坑。

cdn回源php_CDN 回源之罪魁祸首-etag相关推荐

  1. conda添加清华源和删除清华源改回默认源

    添加清华源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda con ...

  2. 脚本检测CDN节点资源是否与源站资源一致

    需求: 1.所有要检测的资源url放到一个单独文件中 2.检测cdn节点资源大小与源站文件大小是否一致 3.随机抽查几个资源,检查md5sum是否一致 4.使用多线程,可配置线程数 代码目录: hex ...

  3. 修改anaconda中conda和pip的源为清华源

    修改anaconda中conda和pip的源为清华源 注: 当前清华源已经过期,请勿在使用该博文conda源 最近又用回python,并且使用anaconda来进行包的管理,但是在下载某些库十分慢,于 ...

  4. 【Mybatis源码】源码分析

    [Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...

  5. Ubuntu20.04切换阿里源镜像(清华源、网易源)

    1.查看Ubuntu版本: sudo lsb_release -a 显示结果如下: 2.备份系统镜像源文件 备份配置文件,当配置出错时,可以回滚,ubuntu镜像配置文件是:/etc/apt/sour ...

  6. pip使用中科大源、清华源或修改默认源为中科大源、清华源、华为源

    pip使用中科大源.清华源或修改默认源为中科大源.清华源.豆瓣源.华为源 pip 临时使用中科大源.清华源.豆瓣源 永久使用中科大源.清华源.豆瓣源 删除中科大源.清华源.豆瓣源 conda wind ...

  7. 商业在用《蝙蝠对冲套利EA系统》及源码均出售--外汇多货币对冲ea策略对冲策略对冲套利对冲源码稳定盈利ea源码MQL源码

    商业在用<蝙蝠对冲套利EA系统>及源码均出售(功能类似于极影ea),需要的欢迎交流--外汇多货币对冲ea策略对冲策略对冲套利对冲源码稳定盈利ea源码MQL源码 1. 套利交易模式 套利交易 ...

  8. pip使用中科大源、清华源或修改默认源为中科大源、清华源

    pip使用中科大源.清华源或修改默认源为中科大源.清华源 pip 临时使用中科大源.清华源 永久使用中科大源.清华源 删除中科大源.清华源 conda windows下 先查看默认源 conda 修改 ...

  9. 万圣节头像挂件生成微信小程序源码【源码好优多】

    简介: 一款万圣节头像挂件微信小程序前端源码,不需要域名服务器直接上传就可以用,已经把源码内的CDN图片地址更换为本地存储,不用担心以后图片失效的问题了. 下方源码地址 万圣节头像挂件生成微信小程序源 ...

  10. java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析

    栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...

最新文章

  1. 精彩回顾|《图像对齐算法》
  2. You don't have permission to access
  3. 数据结构之——选择排序
  4. 学习视觉和语言的多粒度对齐?字节提出新多模态预训练方法 X-VLM:代码已开源!...
  5. html字符串使用xpath,使用XPath和regex在HTML注释中提取文本
  6. 闫智宣的开发版_Android
  7. 以Windows服务方式运行.NET Core程序
  8. 【Elasticsearch】match_phrase搜不出来,怎么办
  9. php:两个文件夹递归地比较,没有的文件自动复制过去
  10. MySQL · 性能优化 · SQL错误用法详解
  11. Scrum立会报告+燃尽图(十月二十三日总第十四次)
  12. Java校园语音通信软件开发
  13. tempo.js模板引擎:通过tempo将Json串填充到html页面中
  14. Ubuntu下使用Exchange邮件服务
  15. Matlab 绘制 BP 神经网络图
  16. 武魂java_ArrayLIst的使用
  17. 实现树莓派控制电机的运转
  18. 07-HTML5举例:简单的视频播放器
  19. 随机性检测标准对比——国密GM/T 0005 vs NIST SP800-22r1a
  20. iphone隐藏底条_iphone隐藏底部小横条,无需越狱

热门文章

  1. 史上最实用网站集锦----不容错过
  2. python范围缩放_如何缩放到初始绘图/缩放的特定范围?
  3. Premiere 关键帧缩放
  4. 时间序列复杂性的度量—近似熵和样本熵
  5. 深挖AI价值与温度,AETA地震预测AI算法大赛开启
  6. 搜狗主动提交url并反馈快照更新软件(含源码)
  7. 原神角色展示(HTML+CSS)
  8. java查找pdf关键字_java实现查找PDF关键字所在页码及其坐标
  9. Oracle去重sql语句
  10. 最好用的五个黑科技搜索引擎推荐