将代码部署到不同的Web服务器时,应该如何处理静态资产?

假设我有两个生产Web服务器( web1web2 )和一个静态资产源服务器( 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似乎是保持两个版本的资产可用:

  1. 版本像/2.1/images/foo.jpg/2.2/images/foo.jpg这样的版本,它使用文件散列来破坏caching清除的目的,或者
  2. 通过将哈希添加到文件名来保留两个版本,例如。 在文件系统中保留/images/foo.oldhash.jpg/images/foo.newhash.jpg ,这会留下一堆需要修剪的旧文件。
  3. 设置清漆保持旧版本的css / js /图像(感觉如果)。

有没有更好的策略,假设我不能完全禁用网站部署?

(StackExchange使用此文件散列方法caching清除…)

如果要在生产环境中重叠版本,则基本上必须在转换过程中保留两个版本。 在path组件中使用版本实际上是我们所做的,因为它对开发者来说非常简单。 方法#2需要更多的脚本编制工作作为您的构build/部署过程的一部分 – 只要再打破一件事情。 我们使用底层文件系统中的硬链接来保持来自/ V1 /和/ V2 /的相同文件占用太多空间,并且也使得修剪变得非常容易。 我们的起源可以在转换期间处理增加的命中(反正在低使用率的时候发生)。