单页应用程序(SPA)的零停机/蓝绿部署

时间:2016-10-05 04:19:01

标签: docker single-page-application downtime usersession blue-green-deployment

昨天我们与团队一起讨论了使用零停机部署来支持我们的单页应用程序的可能性。

在讨论它时,我们确定了一个边缘案例。 用户在浏览器中加载页面后,在重新加载页面之前无法从内存中删除该页面。这意味着如果用户加载页面并开始使用网站(例如开始输入一篇很长的文章,就像我现在正在做的那样),那么在重新加载页面之前他就无法收到它的更新版本。

我们可以忽略用户在浏览器中看到旧应用程序版本的事实,但下面列出了2个点。

  1. 如果我们对用于服务spa的HTTP Api引入了重大更改,那么用户将无法保存他的文章(数据丢失!),或者在执行其他后端相关操作时可能会收到一些其他错误。
  2. 当用户导航到新页面而不重新加载SPA时,他可以接收下一页的模板或与外部旧容器不兼容的某些控件的模板。它可以帮助破坏标记或应用程序逻辑。
  3. 我们不能强迫用户重新登录,因为他可能正在打字他的文章,这只是一个糟糕的用户体验。
  4. 考虑到所有这些要点,可以提出以下解决方案:

    1. 用户1将SPA的v1加载到他的浏览器中。
    2. 除了auth令牌之外,版本信息也会发送到浏览器(例如使用JWT)。
    3. 我们要部署应用程序的v2版本。我们启动v2版本,但不禁用v1。
    4. 用户2将SPA的v2加载到他的浏览器中
    5. 用户1进入SPA的下一页。负载均衡器检查其令牌中的版本信息,并将用户1的流量路由到v1服务器。
    6. 用户2以与v2相同的方式路由。
    7. 用户1注销应用并关闭浏览器。
    8. 用户1登录 - 这次他收到v2。
    9. v1应用程序长时间没有收到任何流量后会被处理掉。
    10. 然而,在这种方法中,可以使多个版本存活,超过2个(例如,如果用户在一天或两天内保持在线)。这意味着在最后一个用户注销之前我们将无法将数据库迁移到新架构(图像如何对Facebook等网站起作用)。拥有多个版本不是问题,但Docker和Rancher等工具可以让我们轻松完成。

      同样在步骤7.用户需要重新加载页面或关闭浏览器 - 否则他仍然会使用v1,我们不能强迫他进入下一个版本。

      我的问题是您使用什么方法来实现单页面应用程序的零停机/蓝绿部署

      当您将流量切换为“绿色”版本时,如何管理应用程序的“蓝色”版本的生命周期,尤其是在现有“蓝色”客户端应用程序方面。

      您是否解决了这些问题,您知道其他任何解决方案吗?

4 个答案:

答案 0 :(得分:1)

我一直在努力解决这个问题很长一段时间,尝试了几种方法,其中一种方法非常有效:

  • 捆绑SPA时使用散列名称(包括图像等)
  • 使用静态资产存储桶(例如:AWS S3)并在部署过程开始之前将所有资产上传到
  • 实施内部指南以最大限度地减少要破坏的API合同(即:只有在X发布后才能删除来自端点的字段)
  • 使用通常的蓝/绿战略部署

原理

使用带有散列包的存储桶 可确保如果客户获得旧版本的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连接,也用于可选的“回滚”,以防绿色环境遇到重大问题。最终,“蓝色”环境在完成所有请求的服务后可以退役。

这种技术要求两个系统有些相似。例如,数据库模式可能使其变得不实用。