如何使用 CDN 和负载均衡器进行文件版本控制?

Dir*_*oer 5 hash load-balancing cdn multi-instance-deployment azure-load-balancer

所以我使用一个非常简单的 CDN 服务。您指向您的网站,如果您通过其主机名调用它,他们会在第一次调用后为您缓存它。

我将其用于所有静态内容,例如 JavaScript 文件和图像。

这一切都很完美——而且我喜欢它的维护或设置成本非常低。

当推出新版本的 JavaScript 文件时,问题就出现了。如果文件发生更改,新的 JavaScript 文件会自动获取新的哈希值。

由于在多个实例上的转出并不是同时进行的,因此会出现问题。我尝试在此图中对其进行建模:

图表

用言语来说:

  • 请求以新版本命中服务器
  • 请求带有新版本哈希的 Js 文件
  • CDN正确检测到文件未缓存
  • CDN 从负载均衡器请求带有新哈希的原始文件
  • 负载均衡器将 CDN 请求提供给随机服务器 - 意外地从旧版本的服务器提供服务
  • CDN 使用新哈希缓存旧版本
  • 每个人都可以从 CDN 获取旧版本

我知道如何解决这个问题 - 即手动将文件上传到单独的存储并烘焙哈希值等。但这需要额外的代码并且有更多的“移动部件”,使维护更加复杂。

我更希望拥有像正常 CDN 行为一样无缝运行的东西。我想这是在多个实例上运行的网站的常见问题,但我找不到很多有关此问题的信息。

解决这个问题的常用方法是什么?

编辑

我认为另一个解决方案是以某种方式强制 CDN 转到 .js 文件与原始 html 文件相同的实例 - 但如何实现呢?

Dir*_*oer 0

我最终通过仅在运行几分钟后引用 CDN 版本来修复此问题。

因此,如果运行时间少于 5 分钟,则表示:

/scripts/example.js?v=351

5分钟后指的是CDN版本:

https://cdn.example.com/scripts/example.js?v=351

5 分钟后,我们非常确定所有实例都在运行新版本,这样我们就不会意外地使用新哈希缓存旧版本。

缺点是,在非常繁忙的时刻,如果您重新部署,您将无法享受 CDN 的优势,但我还没有看到更好的替代方案。