`

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值得改进。这里记录下这个过程是想让看到的同学们避免踏入这个坑。

分享到:
评论

相关推荐

    it618视频直播学院 OSS私有后CDN回源加速与鉴权访问的设置方法1

    阿里云的IT618视频直播学院提供了一种方法,教用户如何利用OSS私有化和CDN回源加速,同时实现鉴权访问,以防止资源被盗链。 首先,OSS私有化是确保内容安全的一种策略。当设置OSS为私有时,直接通过文件URL访问会被...

    360前端cdn公共js库e-z

    幸好我写得一手好爬虫,2016年爬取了360前端js库代码共821MB。自libs.useso.com CDN镜像关闭之后,360前端cdn公共js库a-d和360前端cdn公共js库e-z这两部分便作为私服前端库。

    兄弟 DCP-9020CDN MFC-9140CDN-9340CDW 维修手册.pdf

    本文档是一份关于兄弟(Brother)品牌的彩色激光多功能设备的维修手册,涵盖的机型包括DCP-9020CDN、MFC-9140CDN以及MFC-9340CDW。手册中除了提供常规的维修步骤和指导外,还涉及了定影清零等特定维修操作。 2. ...

    阿里云CDN服务-API手册-D.docx

    阿里云CDN服务-API手册-D 本文档介绍了阿里云CDN服务的API手册,旨在帮助用户快速入门使用CDN服务。CDN服务提供了内容分发网络,用户可以使用本文档介绍的API对CDN服务进行相关操作。 CDN API概述 CDN API提供了...

    yandex-cdn:grunt-google-cdn 和 gulp-google-cdn 插件。 替换对 Yandex CDN 资源的引用

    yandex-cdn 这是 grunt-google-cdn 和 gulp-google-cdn 的插件,用于替换上资源的引用。 支持的库(所有最新版本):首先执行npm install --save-dev yandex-cdn 。如何与 gulp-google-cdn 一起使用只需将此模块传递...

    阿里云CDN服务-常见问题-D.docx

    阿里云CDN服务-常见问题-D 阿里云CDN服务的优势包括: * 稳定快速:先进的分布式系统架构,节点储备量...阿里云CDN服务的源站域名不能与加速域名相同,否则会导致请求反复解析到CDN节点上,CDN节点无法回源拉取内容。

    阿里云CDN服务-用户指南-D.docx

    阿里云CDN服务-用户指南-D.docx

    阿里云CDN服务-CLI手册-D.docx

    阿里云CDN服务-CLI手册-D.docx

    360前端cdn公共js库a-d

    幸好我写得一手好爬虫,2016年爬取了360前端js库代码共821MB。自libs.useso.com CDN镜像关闭之后,360前端cdn公共js库a-d和360前端cdn公共js库e-z这两部分便作为私服前端库。

    阿里云CDN服务-SDK手册-D.docx

    - 同样在2015年12月29日的更新中,增加了16个资源监控接口,用于获取网络流量、带宽、回源流量、带宽、字节命中率、访问QPS和HTTP状态码等统计信息。 5. **直播业务操作接口**: - 同一时期,还提供了8个直播业务...

    Python库 | pypi_cdn_log_archiver-0.1.5-py2.7.egg

    资源分类:Python库 所属语言:Python 资源全名:pypi_cdn_log_archiver-0.1.5-py2.7.egg 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    阿里云CDN服务-产品简介-D.docx

    阿里云CDN(内容分发网络)是一种高效的内容传输服务,旨在通过遍布全球的边缘节点服务器群,替代传统的中心化WEB Server数据传输模式,以优化用户访问速度和降低网络拥塞。该服务采用智能对象热度算法,实现资源的...

    阿里云CDN服务-工具说明-D.docx

    CDN通过将静态资源缓存到分布在世界各地的边缘节点上,使得用户可以从最近的节点获取内容,从而减少延迟和减轻源站压力。在阿里云CDN服务中,提供了多种工具来帮助用户更高效地管理和优化CDN使用。 1. **CDN日志...

    webpack4-cdn-plugin:上传 webpack 资源到 cdn,允许重命名散列资源

    webpack4-cdn-插件 将您的 webpack 生成的资产上传到 CDN,允许重命名/重新哈希。 要求和重要说明 Node 8+ (支持async/await )是必需的推荐。 此插件尚未在Windows平台上进行测试。 此插件仅支持webpack@4 。 ...

    一秒延时直播CDN+P2P服务分析-

    YFMS支持RTMP、HLS等多种协议,具备单线程、多进程、源站集群等核心功能,配置运维性能及日志数据采集能力强,支持动态配置和可追溯日志。其性能指标在市场上表现突出,单进程支持高达10000并发,RTMP延时控制在700...

    ReplaceGoogleCDN-master.zip

    chrome替换谷歌CDN插件

    Python-批量测试B站海外CDN节点延迟找出最低延迟的节点

    压缩包中的`miyouzi-akamTester-c1a39cf`可能是项目的源代码文件,包含了实现上述功能的Python脚本。分析这个文件可以帮助我们深入理解如何实现批量测试和延迟分析的具体细节。 在实际应用中,此类工具可以帮助B站...

Global site tag (gtag.js) - Google Analytics