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