持续的“热”部署一个angular度的Web应用程序

如何在不中断服务的情况下部署AngularJS单页网页应用(基于API)的新版本?

我们最后需要:

  • 更新来源(服务器和客户端)
  • 迁移/更新数据库
  • 重新启动服务器

即使是负载均衡器,最后还有两台服务器(一台服务器正在更新,另一台正在服务),我无法想象一个安全的方式来部署新版本,而不会中断服务,也不会丢失用户数据。

想象一下,在我们的Web应用程序中,一个用户正在处理复杂的文档。 我们不能强制在工作期间重新加载页面

怎么做 ? 如果不可能,如何缓解这个问题?

服务器端

那么,让你的服务成为无状态的,并把会话转移到客户端会容易得多 – 你根本不需要用会话戳(虽然这种方法有它自己的缺点)。

客户端

在这种情况下,您将需要一个带有健康检查的循环负载均衡器(最简单的负载均衡器)。 然后,您将可以轻松地逐一更新服务器端。

客户端更新 (这是简单的静态资产交换)期间是否需要服务重新启动取决于您用于服务资产的Web服务器。

数据库

数据库的完整性是一个棘手的话题。 实现这一点的一种方法是创build数据库复制群集 – 主服务器和从属服务器 。 当你的主人失望时,其中一个奴隶正在为客户服务。 当主设备启动时,从设备将间歇性数据推回给主设备,并赋予主设备为客户提供服务的权限。 怎么做? 这是真正的问题:)

一些数据库支持二进制模式演变 – 他们可以将数据从副本更新为主模式更改。

有些数据库支持实时模式 ,但仍然非常有限。

解决方法

由于您具有文档编辑function并且没有实时更新/读取,因此可以在客户端上caching用户数据 (例如,使用localStorage)。

所有修改都可以存储为delta ,修改数据库状态(类似于事件源 )。

或者,您可以只存储整个文档模型 (deltas是协作编辑必备的)。

在保存过程中,当您从服务器收到错误的响应时,您只需依靠客户端的caching。

不要忘记指出你的用户在遇到连接问题时可能会丢失一些数据。 这是为了好的UX。

恢复

每个方面都没有银弹 。 stream程步骤总是取决于项目上下文。

更新过程应提前考虑,并作为系统devise活动的一部分。