如何处理应用程序的多个版本?
How to handle multiple versions of an application?
我已经使用 nodejs 后端服务器构建了一个 iOS 和 Android 应用程序,该应用程序现已投入生产,但由于我是新手,所以我不知道如何处理更新服务器和应用程序。
首先,我应该如何在不停机的情况下更新 nodejs 服务器?
其次,假设我在我的应用程序上进行了聊天,由于某些原因我必须更改它,但更改与以前的版本不兼容,我应该如何操作?
我觉得这个问题还不是很清楚,但我不知道要在 google 上搜索什么来指出正确的方向,任何东西都会有帮助
更新后端服务器确实很痛苦。如果不停机,您就无法真正做到这一点。但是,假设您的客户使用域而不是普通 IP 地址访问您的服务器,您可以做的是准备另一台服务器,尽可能使用最新数据并进行 DNS 记录更新以将数据重定向到它。请记住,DNS 的更新时间很长,其中一些客户端到达旧服务器,一些客户端到达新服务器(如果数据一致性对您很重要,这意味着很头疼)
改变 API 是另一种痛苦。通常,您需要同时支持旧版本的应用程序和新版本的应用程序。大多数应用商店都会让您了解应用版本的统计信息,以及何时可以安全地停止对旧版本的支持。
不过,一种常见的做法是对 API 端点进行版本控制,以便应用程序的版本 1 访问 URL/API/v1/...
和版本访问 URL/API/v2/...
,这使您可以根据客户端版本发送不同的回复。自从对协议进行重大更改后,您每次都会增加版本。这使得 "future compatible" 协议
在某些情况下,您最初会添加一种机制,让服务器向旧版本的客户端发送一条消息,说明他们的版本已过时,需要更新...
大多数大型应用程序已经有这样的机制,而大多数小型应用程序只是冒着停机的风险并放弃对一些未更新客户端的支持...
无需停机即可更新服务器
答案实际上取决于您的基础架构是如何配置的。
一种方法是使用第二台服务器,配置新软件,准备就绪,然后切换到新服务器。如果你要经常这样做,那么用 mechanism/tooling 来做这件事肯定会简化事情。如果事情也出现严重错误,您只需切换回来。
我们使用 AWS。作为启动更新的一部分,我们提供了一些实例来匹配当前数量(因此我们不会突然需要启动数百个实例)。当所有实例都准备就绪时,我们的负载均衡器会从当前配置切换到新配置。当缓存开始填充时,除了轻微的延迟之外,没有人看到任何其他东西。
处理不兼容的数据
这就是版本控制的用武之地。
版本控制 API - 我们的应用程序 API 有多个版本。它们中的每一个都只是最新形式的代理。因此,当我们将 API 升级到新版本时,我们更新支持版本的映射器,以便客户端的 input/output 不会改变,但在内部,主要代码库正在运行仅在最新代码上。映射器在用户和主库之间传递数据。
版本化正在发送消息的数据 - 由于这是一个应用程序,传入的数据应该进行版本化,因此发送 v1 数据的应用程序(如果您还没有版本,则为未版本化)必须升级服务器为 v2 格式。从那时起,它就是v2。在出路时,需要将 v2 结果向下映射到 v1。重要的是要了解映射可能并不总是可行的。如果您有从 v1 到 v2 的 consolidated/split 个属性,您将不得不计算出从 v1 和 v2 的角度来看数据应该是什么样子。
对存储的数据进行版本控制 - 根据数据的存储方式,存在不同的技术。如果您使用的是 RDBMS,那么迁移和可重复项通常用于升级数据,以供新应用程序在其上运行。当您需要升级软件以暂时支持这两种模式时,事情就变得有趣了。如果不使用 RDBMS,我见过的一种技术是在读取时升级数据。因此,假设您有某种文档存储,当您阅读文档时,请检查版本。如果旧,请升级并保存它。现在您可以将其视为最新版本。这里的一大优势是不会发生长时间的 运行 数据迁移。随着时间的推移,数据会升级。缺点是每次读取都需要进行版本检查。所以。也许混搭。在每次读取时引入 check/upgrade/save 。创建一个数据迁移工具,其唯一的工作就是搜索数据。迁移完所有数据后,删除检查(因为所有数据都是新数据,因此匹配最新版本或已迁移到最新版本)和迁移器。
我在 PHP 世界工作,我使用 Phinx 来处理 DML(数据)迁移,并使用我们自己的可重复代码来处理 DDL(架构更改)。
我已经使用 nodejs 后端服务器构建了一个 iOS 和 Android 应用程序,该应用程序现已投入生产,但由于我是新手,所以我不知道如何处理更新服务器和应用程序。
首先,我应该如何在不停机的情况下更新 nodejs 服务器?
其次,假设我在我的应用程序上进行了聊天,由于某些原因我必须更改它,但更改与以前的版本不兼容,我应该如何操作?
我觉得这个问题还不是很清楚,但我不知道要在 google 上搜索什么来指出正确的方向,任何东西都会有帮助
更新后端服务器确实很痛苦。如果不停机,您就无法真正做到这一点。但是,假设您的客户使用域而不是普通 IP 地址访问您的服务器,您可以做的是准备另一台服务器,尽可能使用最新数据并进行 DNS 记录更新以将数据重定向到它。请记住,DNS 的更新时间很长,其中一些客户端到达旧服务器,一些客户端到达新服务器(如果数据一致性对您很重要,这意味着很头疼)
改变 API 是另一种痛苦。通常,您需要同时支持旧版本的应用程序和新版本的应用程序。大多数应用商店都会让您了解应用版本的统计信息,以及何时可以安全地停止对旧版本的支持。 不过,一种常见的做法是对 API 端点进行版本控制,以便应用程序的版本 1 访问
URL/API/v1/...
和版本访问URL/API/v2/...
,这使您可以根据客户端版本发送不同的回复。自从对协议进行重大更改后,您每次都会增加版本。这使得 "future compatible" 协议在某些情况下,您最初会添加一种机制,让服务器向旧版本的客户端发送一条消息,说明他们的版本已过时,需要更新...
大多数大型应用程序已经有这样的机制,而大多数小型应用程序只是冒着停机的风险并放弃对一些未更新客户端的支持...
无需停机即可更新服务器
答案实际上取决于您的基础架构是如何配置的。
一种方法是使用第二台服务器,配置新软件,准备就绪,然后切换到新服务器。如果你要经常这样做,那么用 mechanism/tooling 来做这件事肯定会简化事情。如果事情也出现严重错误,您只需切换回来。
我们使用 AWS。作为启动更新的一部分,我们提供了一些实例来匹配当前数量(因此我们不会突然需要启动数百个实例)。当所有实例都准备就绪时,我们的负载均衡器会从当前配置切换到新配置。当缓存开始填充时,除了轻微的延迟之外,没有人看到任何其他东西。
处理不兼容的数据
这就是版本控制的用武之地。
版本控制 API - 我们的应用程序 API 有多个版本。它们中的每一个都只是最新形式的代理。因此,当我们将 API 升级到新版本时,我们更新支持版本的映射器,以便客户端的 input/output 不会改变,但在内部,主要代码库正在运行仅在最新代码上。映射器在用户和主库之间传递数据。
版本化正在发送消息的数据 - 由于这是一个应用程序,传入的数据应该进行版本化,因此发送 v1 数据的应用程序(如果您还没有版本,则为未版本化)必须升级服务器为 v2 格式。从那时起,它就是v2。在出路时,需要将 v2 结果向下映射到 v1。重要的是要了解映射可能并不总是可行的。如果您有从 v1 到 v2 的 consolidated/split 个属性,您将不得不计算出从 v1 和 v2 的角度来看数据应该是什么样子。
对存储的数据进行版本控制 - 根据数据的存储方式,存在不同的技术。如果您使用的是 RDBMS,那么迁移和可重复项通常用于升级数据,以供新应用程序在其上运行。当您需要升级软件以暂时支持这两种模式时,事情就变得有趣了。如果不使用 RDBMS,我见过的一种技术是在读取时升级数据。因此,假设您有某种文档存储,当您阅读文档时,请检查版本。如果旧,请升级并保存它。现在您可以将其视为最新版本。这里的一大优势是不会发生长时间的 运行 数据迁移。随着时间的推移,数据会升级。缺点是每次读取都需要进行版本检查。所以。也许混搭。在每次读取时引入 check/upgrade/save 。创建一个数据迁移工具,其唯一的工作就是搜索数据。迁移完所有数据后,删除检查(因为所有数据都是新数据,因此匹配最新版本或已迁移到最新版本)和迁移器。
我在 PHP 世界工作,我使用 Phinx 来处理 DML(数据)迁移,并使用我们自己的可重复代码来处理 DDL(架构更改)。