昨天我们与团队一起讨论了使用零停机部署来支持我们的单页面应用程序的可能性。
在讨论它时,我们确定了一个边缘案例。用户在浏览器中加载页面后,在重新加载页面之前无法从内存中删除该页面。这意味着如果用户加载页面并开始使用网站(例如开始输入类似我现在正在做的长篇文章),那么在重新加载页面之前,他无法收到它的更新版本。
我们可以忽略用户在浏览器中看到旧应用程序版本的事实,但下面列出了2个点。
考虑到所有这些要点,我们将提出以下解决方案:
然而,在这种方法中,可以使多个版本存活,超过2个(例如,如果用户在一整天或两天内保持在线)。这意味着在最后一个用户注销之前我们将无法将数据库迁移到新架构(图像如何对Facebook等网站起作用)。拥有多个版本不是问题,但Docker和Rancher等工具可以让我们轻松完成。
同样在步骤7.用户需要重新加载页面或关闭浏览器 - 否则他仍将使用v1,我们不能强迫他进入下一个版本。
我的问题是您使用什么方法来实现单页面应用程序的零停机/蓝绿部署?
当您将流量切换到“绿色”版本时,如何管理应用程序的“蓝色”版本的生命周期,尤其是在现有的“蓝色”客户端应用程序方面。
你有没有解决这些问题,你知道其他任何解决方案吗?
我一直在努力解决这个问题很长一段时间,尝试了几种方法,其中一种方法非常有效:
使用带有散列捆绑包的存储桶可确保如果客户获得旧版本的SPA,则其所有资产将在任何部署过程之前/期间/之后可用。执行内部指导以不破坏API兼容性有时是棘手的,但它来自适用于任何公共API的相同原则。拥抱/调整大型参与者的API弃用政策有助于在与团队沟通时使用具体示例。
您可能会考虑的一种方法是在这样的时刻逐步重新加载SPA,这对于最终用户来说不是繁重的(甚至是不明显的)。
建议的方法:
系统的彩色版本(提供后端服务,API和前端的组件)“知道”(运行时提供)其“颜色”。为用户提供前端应用程序的组件将此颜色信息嵌入到SPA中。然后发送(通过cookie或自定义http标头)SPA每个请求都发送到后端。
路由API调用的组件(api网关,负载均衡器,nginx,HAproxy,基于Zuul的自定义路由器等)知道此颜色信息,并使用它将流量引导到正确颜色的基础结构。
此外,还有一个公共URL(不是由“彩色”基础设施提供 - 例如通过CloudFront或其他代理提供的S3文件),具有最新版本颜色。 SPA每隔一段时间(60或120秒)检查此版本。如果版本不匹配,则在加载时提供一个SPA,然后在主要的下一个路径上更改页面“物理地”重新加载,而不是仅在浏览器中实现此导航。
您可以选择哪种路由更改正在验证此版本,使其对用户最不突兀(可能几乎无法察觉)。
如果您选择所有用户每天使用的某些路由,那么很快所有用户都将迁移到最新颜色。那些长时间未使用打开浏览器窗口的人(计算机休眠两周?)可以通过在一段时间不活动后强制重新加载来处理。
我希望我能够让自己听起来有点凝聚力:-)
此致,Wojtek
不确定为什么要对UI进行全面检修,因为它们始终是一个学习曲线。实际上,在现实世界中,立即切换到新的UI是个坏主意。您可以允许客户在一段时间内切换到新界面,然后在预警后禁用旧版本。不值得这样的实时切换的努力。 A / B测试可以是一种向客户介绍新界面然后进行实际部署的方法。
您描述的技术称为蓝绿色部署;您从现有服务器(蓝色)开始,然后添加更新的服务器(绿色)。从该点开始的所有新流量都将重定向到绿色环境。蓝色环境仅用于维护现有的http连接,也用于可选的“回滚”,以防绿色环境遇到重大问题。最终,当“蓝色”环境完成对其所有请求的服务后,它就可以退役。
该技术要求两个系统有些相似。例如,数据库模式可能使其变得不实用。