4

记录MVC项目部署时的CDN缓存问题

 2 years ago
source link: https://segmentfault.com/a/1190000041068031
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

记录MVC项目部署时的CDN缓存问题

本文将分析在发布前后端未分离项目(freemaker)时遇到的CDN缓存问题,主要有以下两个问题:

  • 页面请求获取的html里面却是旧版本号的script链接
  • script脚本链接是新版本号但拉取到的却是旧脚本代码

1、页面请求获取的html里面却是旧版本号的script链接

问题分析前首先我们要知道以下知识点:

(1)freemaker项目的页面是后端服务将ftl处理成html返回的

(2)部署时会遍历ftl文件,对所有的script链接打上版本号

// 构建前 supplierQuoteDetailPaging.ftl

<!DOCTYPE html>
    <head>
        <script type="text/javascript" src="${Global.getConfig("web.app.static.url")}/js/supplierQuoteDetail.js"></script>
    </head>
</html>


// 在`Jenkins`构建后会对请求静态脚本的`url`加上版本号 supplierQuoteDetailPaging.ftl

<!DOCTYPE html>
    <head>
        <script type="text/javascript" src="${Global.getConfig("web.app.static.url")}/js/supplierQuoteDetail.js?version=1638706227856"></script>
    </head>
</html>

(3)后端是集群服务,部署采用滚动发布,也就是说部署时节点服务是一批一批来更新的,直到集群中所有的实例都更新成新版本,而不是一次性全量更新

当项目还是部署时,因为服务采用滚动发布,因此在这个期间新服务和旧服务会同时存在。如果在这个阶段访问页面,页面接口可能命中旧服务,也可能命中新服务,当命中旧服务时,请求得到的html里面script链接打上的是旧版本号;当部署完成时,群中所有的实例都更新成新版本,页面请求命中新服务,请求得到的html里面script链接打上的是新版本号。

部署后html中不是最新的版本号.png

解决方案:待项目部署完成后刷新页面就可以了

2、script脚本链接是新版本号但拉取到的却是旧脚本代码

正常来说,部署项目后,浏览器根据新版本号去请求CDN上的静态脚本文件,如果CDN缓存中没有对应新版本号对应的脚本文件,则会向后端服务拉取新脚本,然后CDN在做一次缓存,后面的脚本请求直接由CDN返回。

但是,如果部署还未完成浏览器就去访问了,此时这个阶段新服务和旧服务是同时存在的,当新版本号对应的脚本在CDN上找不到时,就会去服务请求,恰恰请求命中的是旧服务(服务响应跟版本号无关),旧服务返回旧的脚本,然后CDN缓存新版号对应的旧脚本,这样后续每次请求拉取到的都是CDN上缓存的就脚本,因此就出现了上述问题。

新版本号未拉取到新脚本.png

解决方案:重新部署一遍,待部署完成后再去访问页面


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK