记录MVC项目部署时的CDN缓存问题
概述
本文将分析在发布前后端未分离项目(freemaker
)时遇到的CDN
缓存问题,主要有以下两个问题:
- 页面请求获取的
html
里面却是旧版本号的script
链接 script
脚本链接是新版本号但拉取到的却是旧脚本代码
html
里面却是旧版本号的script
链接问题分析前首先我们要知道以下知识点:
(1)
freemaker
项目的页面是后端服务将ftl
处理成html
返回的(2)部署时会遍历
ftl
文件,对所有的script
链接打上版本号// 构建前 supplierQuoteDetailPaging.ftl// 在`Jenkins`构建后会对请求静态脚本的`url`加上版本号 supplierQuoteDetailPaging.ftl
(3)后端是集群服务,部署采用滚动发布,也就是说部署时节点服务是一批一批来更新的,直到集群中所有的实例都更新成新版本,而不是一次性全量更新
当项目还是部署时,因为服务采用滚动发布,因此在这个期间新服务和旧服务会同时存在。如果在这个阶段访问页面,页面接口可能命中旧服务,也可能命中新服务,当命中旧服务时,请求得到的
html
里面script
链接打上的是旧版本号;当部署完成时,群中所有的实例都更新成新版本,页面请求命中新服务,请求得到的html
里面script
链接打上的是新版本号。文章图片
解决方案:待项目部署完成后刷新页面就可以了
2、
script
脚本链接是新版本号但拉取到的却是旧脚本代码正常来说,部署项目后,浏览器根据新版本号去请求
CDN
上的静态脚本文件,如果CDN
缓存中没有对应新版本号对应的脚本文件,则会向后端服务拉取新脚本,然后CDN
在做一次缓存,后面的脚本请求直接由CDN
返回。但是,如果部署还未完成浏览器就去访问了,此时这个阶段新服务和旧服务是同时存在的,当新版本号对应的脚本在
CDN
上找不到时,就会去服务请求,恰恰请求命中的是旧服务(服务响应跟版本号无关),旧服务返回旧的脚本,然后CDN
缓存新版号对应的旧脚本,这样后续每次请求拉取到的都是CDN
上缓存的就脚本,因此就出现了上述问题。文章图片
【记录MVC项目部署时的CDN缓存问题】解决方案:重新部署一遍,待部署完成后再去访问页面
推荐阅读
- 20170612时间和注意力开销记录
- 【剽悍读书营成长记录】2018年我收获了什么|【剽悍读书营成长记录】2018年我收获了什么 3357-小松
- 17|17 关山松 第二课作业#公众号项目# D20
- RxJava|RxJava 在Android项目中的使用(一)
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 课后分享记录
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- 靠QQ月入上万灰色暴利偏门的项目
- 感赏15+投射
- spring|spring boot项目启动websocket