【发布时间】:2017-02-13 09:23:40
【问题描述】:
昨天我们与团队一起讨论了使用零停机时间部署来支持我们的单页应用程序的可能性。
在讨论它时,我们确定了它的一种极端情况。 用户在浏览器中加载页面后,在重新加载页面之前无法将其从内存中删除。这意味着如果用户加载页面并开始使用该网站(例如开始像我现在所做的那样开始输入一篇长文章),那么在他重新加载页面之前,他无法收到它的更新版本。
我们可以忽略用户在其浏览器中看到旧应用程序版本的事实,但下面列出了 2 点。
- 如果我们对用于服务 spa 的 HTTP Api 进行重大更改,则用户将无法保存他的文章(数据丢失!),或者在执行其他后端相关操作时可能会收到其他错误。李>
- 当用户导航到新页面而不重新加载 SPA 时,他会收到下一页的模板或与外部旧容器不兼容的某些控件的模板。它可能会导致标记或应用程序逻辑损坏。
- 我们不能强制用户重新登录,因为他可能正在输入他的文章,这只是一个糟糕的用户体验。
考虑到所有这些点,可以提出以下解决方案:
- 用户 1 将 SPA 的 v1 加载到他的浏览器中。
- 版本信息与身份验证令牌一起发送到浏览器(例如使用 JWT)。
- 我们想要部署我们的应用程序的 v2 版本。我们启动了 v2 版本,但不禁用 v1。
- 用户 2 将 SPA 的 v2 加载到他的浏览器中
- 用户 1 转到 SPA 中的下一页。负载均衡器检查其令牌中的版本信息,并将用户 1 的流量路由到 v1 服务器。
- 用户 2 以相同的方式路由到 v2。
- 用户 1 退出应用并关闭浏览器。
- 用户 1 重新登录 - 这次他收到 v2。
- v1 应用程序在长时间没有收到任何流量后被丢弃。
但是,在这种方法中,可以有多个版本,超过 2 个(例如,如果用户一整天或两天都在线)。这意味着在最后一个用户注销之前,我们将无法将数据库迁移到新模式(想象一下它如何适用于 Facebook 等网站)。拥有多个版本不是问题,但是像 Docker 和 Rancher 这样的工具让我们可以轻松地做到这一点。
也在第 7 步中。用户需要重新加载页面或关闭浏览器 - 否则他仍将使用 v1,我们无法强制他进入下一个版本。
我的问题是您使用什么方法来实现单页应用程序的零停机/蓝绿部署?
当您将流量切换到“绿色”版本时,您如何管理应用程序“蓝色”版本的生命周期,尤其是对于现有的“蓝色”客户端应用程序。
这些问题你解决了吗,你知道其他解决方法吗?
【问题讨论】:
-
我很想知道您最终的决定。我目前正在思考这样的问题。谢谢。
-
事实上我没有得到确切的解决方案 - 我正在做一种蓝/绿部署方法的研究或 POC。一种可能的解决方案是启用绝对会话到期并强制每个用户每天至少注销一次。在这种情况下,您还需要强制用户重新加载浏览器页面并重新加载 JS 应用程序。在这种情况下,可以在最早的登录会话结束后进行切换。
标签: docker single-page-application downtime usersession blue-green-deployment