【发布时间】:2013-06-10 08:57:20
【问题描述】:
我们的生产环境出现问题,也许其他人遇到了这个问题并有一个聪明的解决方案。
先决条件:
- 我们在两台前端服务器前使用负载平衡器。
- 我们使用 CDN 交付静态资产,例如 CSS/JS/图像。
- 我们使用 SquishIt 通过校验和对 JS/CSS 文件进行指纹识别,以提供缓存清除功能
- 我们在应用程序启动时在资产路径前添加 CDN 路径。这也是一个 SquishIt 功能 (.WithOutputBaseHref)。示例:
/ui/main_465987ecb75.css将呈现为//cdn.host.com/ui/main_465987ecb75.css
部署例程:
- 从负载平衡器中移除 server1。
- 部署到 server1。
- 热身。
- 在负载平衡器中包含服务器 1。
- 从负载平衡器中取出 server2(...并重复步骤 2-4)
这就是失败的地方:
在上述第 4 步和第 5 步之间,我们让两台服务器都在线了很短的时间。在此期间,server1 可能正在引用 main_46eb48ac968.css,而 server2 可能正在引用 main_987eba4687.css。这会在以下场景中造成麻烦...
用例:
- 用户访问该站点并最终访问新部署的服务器 1。
- 浏览器将从 CDN 请求 main_46eb48ac968.css。
- CDN 从负载均衡器请求该文件,因为它不在其缓存中。
- 负载均衡器将 CDN 请求发送到 server2。
- Server2 返回 404 page not found 错误,因为新文件仅在服务器 1 上。
- 网站看起来很垃圾!
一个简单的解决方法当然是在部署期间不使用 CDN 运行,但由于 CDN url 在应用程序启动期间预先添加到路径中,我们必须在生产中重新启动应用程序...:/
想法?
【问题讨论】:
标签: .net css deployment squishit