cdn回源php_CDN 回源之罪魁祸首-etag
最近网站做推广,预期访问量将会增加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相关推荐
- conda添加清华源和删除清华源改回默认源
添加清华源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda con ...
- 脚本检测CDN节点资源是否与源站资源一致
需求: 1.所有要检测的资源url放到一个单独文件中 2.检测cdn节点资源大小与源站文件大小是否一致 3.随机抽查几个资源,检查md5sum是否一致 4.使用多线程,可配置线程数 代码目录: hex ...
- 修改anaconda中conda和pip的源为清华源
修改anaconda中conda和pip的源为清华源 注: 当前清华源已经过期,请勿在使用该博文conda源 最近又用回python,并且使用anaconda来进行包的管理,但是在下载某些库十分慢,于 ...
- 【Mybatis源码】源码分析
[Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...
- Ubuntu20.04切换阿里源镜像(清华源、网易源)
1.查看Ubuntu版本: sudo lsb_release -a 显示结果如下: 2.备份系统镜像源文件 备份配置文件,当配置出错时,可以回滚,ubuntu镜像配置文件是:/etc/apt/sour ...
- pip使用中科大源、清华源或修改默认源为中科大源、清华源、华为源
pip使用中科大源.清华源或修改默认源为中科大源.清华源.豆瓣源.华为源 pip 临时使用中科大源.清华源.豆瓣源 永久使用中科大源.清华源.豆瓣源 删除中科大源.清华源.豆瓣源 conda wind ...
- 商业在用《蝙蝠对冲套利EA系统》及源码均出售--外汇多货币对冲ea策略对冲策略对冲套利对冲源码稳定盈利ea源码MQL源码
商业在用<蝙蝠对冲套利EA系统>及源码均出售(功能类似于极影ea),需要的欢迎交流--外汇多货币对冲ea策略对冲策略对冲套利对冲源码稳定盈利ea源码MQL源码 1. 套利交易模式 套利交易 ...
- pip使用中科大源、清华源或修改默认源为中科大源、清华源
pip使用中科大源.清华源或修改默认源为中科大源.清华源 pip 临时使用中科大源.清华源 永久使用中科大源.清华源 删除中科大源.清华源 conda windows下 先查看默认源 conda 修改 ...
- 万圣节头像挂件生成微信小程序源码【源码好优多】
简介: 一款万圣节头像挂件微信小程序前端源码,不需要域名服务器直接上传就可以用,已经把源码内的CDN图片地址更换为本地存储,不用担心以后图片失效的问题了. 下方源码地址 万圣节头像挂件生成微信小程序源 ...
- java 头尾 队列_源码|jdk源码之栈、队列及ArrayDeque分析
栈.队列.双端队列都是非常经典的数据结构.和链表.数组不同,这三种数据结构的抽象层次更高.它只描述了数据结构有哪些行为,而并不关心数据结构内部用何种思路.方式去组织. 本篇博文重点关注这三种数据结构在 ...
最新文章
- 精彩回顾|《图像对齐算法》
- You don't have permission to access
- 数据结构之——选择排序
- 学习视觉和语言的多粒度对齐?字节提出新多模态预训练方法 X-VLM:代码已开源!...
- html字符串使用xpath,使用XPath和regex在HTML注释中提取文本
- 闫智宣的开发版_Android
- 以Windows服务方式运行.NET Core程序
- 【Elasticsearch】match_phrase搜不出来,怎么办
- php:两个文件夹递归地比较,没有的文件自动复制过去
- MySQL · 性能优化 · SQL错误用法详解
- Scrum立会报告+燃尽图(十月二十三日总第十四次)
- Java校园语音通信软件开发
- tempo.js模板引擎:通过tempo将Json串填充到html页面中
- Ubuntu下使用Exchange邮件服务
- Matlab 绘制 BP 神经网络图
- 武魂java_ArrayLIst的使用
- 实现树莓派控制电机的运转
- 07-HTML5举例:简单的视频播放器
- 随机性检测标准对比——国密GM/T 0005 vs NIST SP800-22r1a
- iphone隐藏底条_iphone隐藏底部小横条,无需越狱