【问题标题】:Continuous "hot" deployment of an angular web appAngular Web 应用程序的持续“热”部署
【发布时间】:2014-02-26 18:49:41
【问题描述】:

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

我们终于需要了:

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

即使有一个负载平衡器和最后 2 个轮换服务器(一个更新,另一个正在服务),我无法找到一种安全的方法来部署新版本而不中断服务和不丢失用户数据。

想象一个用户在我们的网络应用程序中处理一个复杂的文档。我们无法在其工作会话期间强制重新加载其页面...

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

【问题讨论】:

  • 从概念上讲,您可以使用包含会话管理的负载平衡器,因此您可以将用户切换到另一台服务器而不会中断会话。我有一个客户有这样的设置;但他们有负责细节的网络人员。这可能是关于服务器故障的一个更好的问题?
  • @Reboog711 那么 db schéma 呢? (即使在 NoSQL 上)我们无法保持两个不同的软件版本同步......
  • 这取决于你的环境;我想。我相信也有办法对数据库服务器进行负载平衡。因此,取下一台 DB Server 和一台应用程序服务器。更新两者。在你放下另一套的同时把它们拿回来。
  • @Reboog711 然后在切换期间创建的所有新数据都将丢失:-/

标签: node.js angularjs deployment web-deployment


【解决方案1】:

服务器端

好吧,让您的服务无状态并将会话移动到客户端会容易得多 - 您根本不需要戳会话(这种方法虽然有它自己的缺点)。

客户端

在这种情况下,您将需要一个带有运行状况检查的 循环 负载平衡器(最简单的)。然后您将能够轻松地一一更新服务器端。

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

数据库

数据库完整性是一个棘手的话题。实现此目的的一种方法是创建数据库复制集群 - 主从服务器。当您的主服务器关闭时,其中一个从服务器正在为客户端服务。当主服务器启动时,从服务器将间歇性数据推送回主服务器,并赋予主服务器服务客户端的权限。怎么做? 这是真正的问题:)

一些数据库支持二进制模式演变 - 它们可以根据模式更改将数据从副本更新到主数据库。

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

解决方法

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

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

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

当您在保存过程中从服务器收到错误响应时,您只是继续依赖客户端的缓存。

不要忘记告诉您的用户,当您遇到连接问题时,他可能会丢失一些数据。这是为了获得良好的用户体验。

简历

这些方面都没有灵丹妙药。流程步骤始终取决于项目环境。

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

【讨论】:

  • 现在我有很多事情要考虑...感谢您解决数据库问题!
猜你喜欢
  • 2011-07-01
  • 2012-11-27
  • 2014-05-15
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多