假设我有两个生产Web服务器( web1和web2 )和一个静态资产源服务器( origin1 ),我想部署新的代码引用新的css / js / images。
在更新web1并将其放回之后,在我将web2移出旋转之前,会有一个简短的窗口,当负载平衡器将请求发送到具有新代码的web1和具有旧代码的web2 :
web1提供html请求http://somecdn/images/foo.jpg?v=newhash web2提供html请求http://somecdn/images/foo.jpg?v=oldhash 所以在这个简短的窗口中, somecdn可能会请求foo.jpg?v=oldhash ,但实际上获得了刚刚部署到origin1的新图像。 这不好。
显而易见的解决scheme似乎是保持两个版本的资产可用:
/2.1/images/foo.jpg和/2.2/images/foo.jpg这样的版本,它使用文件散列来破坏caching清除的目的,或者 /images/foo.oldhash.jpg和/images/foo.newhash.jpg ,这会留下一堆需要修剪的旧文件。 有没有更好的策略,假设我不能完全禁用网站部署?
(StackExchange使用此文件散列方法caching清除…)
如果要在生产环境中重叠版本,则基本上必须在转换过程中保留两个版本。 在path组件中使用版本实际上是我们所做的,因为它对开发者来说非常简单。 方法#2需要更多的脚本编制工作作为您的构build/部署过程的一部分 – 只要再打破一件事情。 我们使用底层文件系统中的硬链接来保持来自/ V1 /和/ V2 /的相同文件占用太多空间,并且也使得修剪变得非常容易。 我们的起源可以在转换期间处理增加的命中(反正在低使用率的时候发生)。