5

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

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

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

推出新版本的 JavaScript 文件时出现问题。如果文件发生变化,新的 JavaScript 文件会自动获得一个新的哈希值。

因为在多个实例上推出并不是同时出现问题。我尝试在此图中对其进行建模:

图表

用一句话来说:

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

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

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

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

编辑

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

4

3 回答 3

1

以下是我过去解决方案中的一些想法,尽管您使用的 CDN 会排除其中一些:

  1. 从 CDN 缓存服务中排除 .js 文件,首先防止它被缓存。
  2. 向 CDN 发送请求以在发布时使特定文件的缓存无效。
  3. 在您的构建/部署脚本中,更改 .js 文件的名称并在您的 HTML 中引用新文件。
  4. 在 .js 文件名之后使用查询参数,这些参数会被忽略但缓存在不同的地址引用下,例如 /mysite/myscript.js?build1234
于 2020-06-22T16:37:30.580 回答
0

这类问题的问题在于缓存控件驻留在浏览器端,因此您不能从服务器端做太多事情。

我知道的最常见的方法基本上是您提到的在文件名或用于获取它们的 URL 中添加一些哈希的方法。

问题是您不应该手动执行此操作。你应该使用一些 web 应用程序构建器,比如 Webpack,来自动化这个过程,这取决于你使用的技术。13 年前,我第一次使用 GWT 看到了这一点,我使用 AngularJS 或 React 使用的所有最后一个项目都已与自动执行您需要的构建器集成。

实施后,您的用户将获得最新版本,并且资源将被正确缓存以加快您的网站速度。

如果您还可以自动化整个管道以在达到配置的过期时间后从 CDN 中删除旧资源,那么您就触摸到了天空。

于 2020-06-22T03:06:42.743 回答
0

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

因此,如果运行时间少于 5 分钟,则它指的是:

/scripts/example.js?v=351

5分钟后,它指的是CDN版本:

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

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

不利的一面是,在非常繁忙的时刻,如果您重新部署,您就没有 CDN 的优势,但我还没有看到更好的选择。

于 2021-04-05T15:43:43.380 回答