如何处理多个版本的应用程序?

时间:2018-02-05 13:52:34

标签: version production

我使用nodejs后端服务器构建了一个iOS和Android应用程序,该服务器现已投入生产,但由于我是新手,我不知道如何处理服务器和应用程序的更新。

首先,如何在没有停机的情况下更新nodejs服务器?

其次,假设我在我的应用上聊了一下,由于某些原因我不得不改变它,但是改变与以前的版本不兼容,我该怎么做?

我认为问题并不完全清楚,但我不知道在谷歌上搜索什么指向正确的方向,任何事情都会有所帮助

2 个答案:

答案 0 :(得分:1)

  1. 更新后端服务器确实很痛苦。没有停机时间,你真的可以做到这一点。你可以做什么,假设你的客户使用域而不是普通的IP地址访问你的服务器,准备另一台服务器尽可能使用最新数据并进行DNS记录更新以将数据重定向到它。请记住,DNS有一个很长的更新时间,其中一些客户端到达旧服务器,一些客户端到达新服务器(这意味着如果数据一致性对您来说很重要,那就非常头疼)

  2. 更改API是另一个痛苦。通常,您需要与较新版本的应用程序并行支持较旧版本的应用程序。大多数应用商店会通知您应用版本的统计信息以及何时放弃对旧版本的支持是安全的。 但是,通常的做法是对API端点进行版本控制,以便您的应用版本1访问index=False,并访问URL/API/v1/...版本,这样您就可以根据客户端版本发送不同的回复。自从对协议进行重大更改后,每次都会增加版本。这使得未来兼容"协议

  3. 在某些情况下,您最初会添加一种机制,让服务器向客户端的旧版本发送消息,说明其版本已过时且需要更新...

  4. 大多数大型应用程序已经拥有这样的机制,而大多数小型应用程序只需要承担一些停机时间的风险,并放弃对少数非更新客户端的支持......

答案 1 :(得分:1)

不停机更新服务器

答案实际上取决于您的基础架构的配置方式。

一种方法是使用新软件配置第二台服务器,准备就绪,然后切换到新服务器。如果你要做很多事情,那么使用机制/工具来做这件事肯定会简化事情。如果事情也出现严重错误,你只需转回去。

我们使用AWS。作为启动更新的一部分,我们提供了许多实例以匹配当前的数字(因此我们不会突然需要几百个实例启动)。当所有实例都准备就绪时,我们的负载均衡器会从当前配置切换到新配置。当缓存开始填充时,没有人会看到除了稍微延迟之外的任何事情。

处理不兼容的数据

这是版本控制的地方。

对API进行版本控制 - 我们的应用程序的API有多个版本。它们中的每一个都只是最新形式的代理。因此,当我们将API升级到新版本时,我们更新支持版本的映射器,以便客户端的输入/输出不会更改,但在内部,主代码库仅在最新代码上运行。映射器在用户和主库之间按摩数据。

对正在发送消息的数据进行版本控制 - 由于这是一个应用程序,所以应该对进入的数据进行版本控制,因此必须在服务器上升级发送v1数据的应用程序(如果还没有版本,那么应用程序已经无版本)到v2格式。从那以后,它是v2。在出路时,需要将v2结果映射到v1。重要的是要理解映射可能并不总是可行的。如果您已将属性从v1合并/拆分为v2,那么您将不得不从v1和v2透视图中了解数据的外观。

对存储的数据进行版本控制 - 根据数据的存储方式,存在不同的技术。如果您使用的是RDBMS,那么迁移和可重复数据通常用于升级数据,以便新应用程序对其进行操作。当您需要升级软件以临时支持这两种模式时,事情变得有趣。如果不使用RDBMS,我看到的一种技术是在读取时升级数据。所以,假设您有某种文档存储,当您阅读文档时,请检查版本。如果旧,请升级并保存。现在您可以将其视为最新版本。这里的一大优势是没有长时间运行的数据迁移。随着时间的推移,数据会升级。缺点是每次读取都需要进行版本检查。所以。也许混合搭配。每次读取时都会引入检查/升级/保存。创建一个数据迁移工具,其唯一工作是遍历数据。迁移所有数据后,请删除检查(因为所有数据都是新的,因此与最新版本匹配或已迁移到最新版本)和迁移器。

我在PHP世界工作,我使用Phinx处理DML(数据)迁移和我们自己的可重复代码来处理DDL(架构更改)。