首页 > 解决方案 > 在网站部署期间确保客户端的一致性

问题描述

假设我有一个网站。像许多其他人一样,它提供引用 CSS 和 JavaScript 文件的 HTML 页面。部署新版本时,我担心以下情况:

  1. 一个客户端加载/index.html
  2. 我的原子无缝部署发生了。
  3. 客户端加载/app.js,它在步骤 1 中加载的 HTML 页面引用了它。

现在客户对我的网站的看法不一致:他们的浏览器加载了版本/index.html版本的/app.js. 然后:

  1. 错误随之而来。客户愤怒地将他们的钱带到别处。

避免这种情况并确保客户端一致性的最佳方法是什么?我想保证所有客户都能看到旧版或新版网站,而不是混合版。

标签: web-deployment

解决方案


我无法找到有关此问题的大量信息。开箱即用的部署解决方案似乎没有任何策略,在线任何地方也没有太多讨论。

我见过的最好的方法归结为几个关键的想法:

  1. 您的 HTML 页面引用的静态资产是不可变的和永恒的;部署后/assets/app.js,您可能永远不会更改它。
  2. 使用明确的版本号部署资产的新版本;您的 HTML 网站的第 23 版应仅引用,例如/assets/app-v23.js.
  3. 如果您的部署不是完全原子的,请分阶段部署。在第一阶段,在整个车队中部署所有新版本的静态资产。这些将不会被任何 HTML 页面引用,因为它们有一个新的版本号。在第二阶段部署所有新版本的 HTML,引用新资产。

资料来源:

  • 最终一致的 webapp 中的静态资产:讨论原始问题中的问题以及当您的部署不是原子的时的额外曲折。虽然该解决方案过度劳累,但它提供了一些有趣的想法。
  • Stealthy shipping with atomic deploys:讨论处理 XHR API 的更新,这是这个问题的一个变体。用户的浏览器具有旧版本的 JavaScript 应用程序,但如果用户不经常刷新,则可能会访问较新版本的 API。

推荐阅读