web-deployment - 在网站部署期间确保客户端的一致性
问题描述
假设我有一个网站。像许多其他人一样,它提供引用 CSS 和 JavaScript 文件的 HTML 页面。部署新版本时,我担心以下情况:
- 一个客户端加载
/index.html
。 - 我的原子无缝部署发生了。
- 客户端加载
/app.js
,它在步骤 1 中加载的 HTML 页面引用了它。
现在客户对我的网站的看法不一致:他们的浏览器加载了旧版本/index.html
和新版本的/app.js
. 然后:
- 错误随之而来。客户愤怒地将他们的钱带到别处。
避免这种情况并确保客户端一致性的最佳方法是什么?我想保证所有客户都能看到旧版或新版网站,而不是混合版。
解决方案
我无法找到有关此问题的大量信息。开箱即用的部署解决方案似乎没有任何策略,在线任何地方也没有太多讨论。
我见过的最好的方法归结为几个关键的想法:
- 您的 HTML 页面引用的静态资产是不可变的和永恒的;部署后
/assets/app.js
,您可能永远不会更改它。 - 使用明确的版本号部署资产的新版本;您的 HTML 网站的第 23 版应仅引用,例如
/assets/app-v23.js
. - 如果您的部署不是完全原子的,请分阶段部署。在第一阶段,在整个车队中部署所有新版本的静态资产。这些将不会被任何 HTML 页面引用,因为它们有一个新的版本号。在第二阶段部署所有新版本的 HTML,引用新资产。
资料来源:
- 最终一致的 webapp 中的静态资产:讨论原始问题中的问题以及当您的部署不是原子的时的额外曲折。虽然该解决方案过度劳累,但它提供了一些有趣的想法。
- Stealthy shipping with atomic deploys:讨论处理 XHR API 的更新,这是这个问题的一个变体。用户的浏览器具有旧版本的 JavaScript 应用程序,但如果用户不经常刷新,则可能会访问较新版本的 API。
推荐阅读
- php - 如何在没有运行时超过 30 秒错误的情况下循环遍历此嵌套数组
- sql - 除自定义工作日外的所有记录的总和日期差异
- python - Python使用字符串值作为类/代码的一部分
- javascript - 将多个选中复选框的值传递到多个相应的输入字段
- python - 我无法在 Matplotlib 中同时获得多个实时绘图 - Python
- jboss - 什么时候在 Oracle ATG 中创建 Jsession id 是来自 JBOSS 还是 ATG?
- firebase - Google ML Engine 在线预测请求没有响应预测结果
- javascript - 如何在 ng-show 和 ng-hide 上应用水平滑动动画?
- php - WordPress is_single 执行此操作,如果不是特定的单个 ID 执行此操作
- sqlite - 使用子组限制创建行组