昨天和团队一起讨论了使用零停机时间部署来支持我们的单页应用程序的可能性。单页应用程序(SPA)的零停机/蓝绿色部署
在讨论它时,我们为它确定了一个边缘案例。 用户在浏览器中加载页面后,无法从内存中删除,直到他重新加载页面。这意味着如果用户加载页面并开始使用网站(例如开始输入像我现在这样做的长篇文章),那么在他重新加载页面之前,他无法收到它的更新版本。
我们可以忽略用户在浏览器中看到旧应用程序版本的事实,但下面列出了2点。
- 如果我们引入一个突兀的变化是用来服务的水疗HTTP API,则用户将不能够救他的文章(数据丢失!)或执行其他后端相关行动时,可以收到一些其他错误。
- 当用户在不重新加载SPA的情况下导航到新页面时,他可以收到下一页的模板或与外部旧容器不兼容的某个控件的模板。它可能会破坏标记或应用程序逻辑。
- 我们不能强迫用户重新登录,因为他可能正在键入他的文章,这只是一个糟糕的用户体验。
把所有论文几点考虑一个可以提出以下解决方案:
- 用户1个加载SPA到他的浏览器V1。
- 与auth令牌一起,版本信息被发送到浏览器(例如使用JWT)。
- 我们想要部署我们的应用程序的V2版本。我们启动了v2版本,但不禁用v1。
- 用户2将SPA的v2加载到他的浏览器中
- 用户1转到SPA的下一页。负载均衡器检查其令牌中的版本信息,并将用户1的流量路由到v1服务器。
- 用户2以相同的方式路由到v2。
- 用户1注销应用程序并关闭浏览器。
- 用户1登录回来 - 这次他收到v2。
- v1应用程序长时间没有收到任何流量后就会处理掉。
然而,在这种方法中,可能有多个版本存活,超过2个(例如,如果用户在一整天或两天内保持联机状态)。这意味着我们将无法将数据库迁移到新模式,直到最后一个用户注销(图像如何可用于Facebook等网站)。然而,拥有多个版本并不是问题,Docker和Rancher等工具允许我们轻松完成。
也在第7步。用户需要重新加载页面或关闭浏览器 - 否则他仍然会与v1一起工作,我们不能强制他到下一个版本。
我现在的问题是你用什么方法做单页面应用的零宕机/蓝绿部署?
当您将流量切换到“绿色”版本时,尤其是现有的“蓝色”客户端应用程序时,如何管理应用程序的“蓝色”版本的生命周期。
您是否已经解决了这些问题,您是否知道其他解决方案?
是的,我知道这是蓝绿色部署,但更确切的问题是,它如何与单页应用程序一起工作,在更新您的应用程序时无法强制用户升级其客户端应用程序服务器部分 – gerichhome