有没有办法确保我部署的 heroku service/app 在更新期间保持 运行?

Is there a way to ensure that a service/app that I have deployed heroku, stays running during an update?

目前我正在努力在 Heroku 上部署服务。该服务轮询 api 并在 Node.js 中使用常规 setInterval 方法来执行此操作以获取新信息(我不能使用 websocket,因为我使用的 api 不是头脑)。

就像某人开发的任何程序或应用程序一样,它需要定期更新。我的问题是在 heroku 上更新我的应用程序的最佳方式是什么,这样当我将新更改推送到生产环境时它不会停止应用程序从 运行?原因是因为我不想错过 api.

的新数据

我的第一个想法是在至少有 2 台服务器 运行 应用程序的情况下进行某种冗余,并且当一个更新另一个运行时,反之亦然。然而,我不确定这是否由 heroku 自动完成,或者如果没有,我如何确保我设置这样的东西不会在更新期间错过一条数据。 API 中甚至缺少一条新数据对我们来说都不是一个选择。

还有其他方法可以做到这一点吗?

在 nodejs 或 Heroku 上没有零停机更新的自动过程。如果您不能或不希望因更新源文件而停机,然后停止并重新启动服务器,那么您将不得不做一些事情,就像您已经在考虑使用两个单独的进程,其中一个进程保持 运行ning而另一个正在更新,反之亦然。

除了轮询一些外部 API 之外,您没有详细说明该应用程序的功能,也没有说明它如何处理从外部 API 获取的数据。这两个都与您将如何实现它的细节相关。

出于说明的目的,我将对这些未知数做出一些假设。让我们假设这个服务应用程序只是用 API 中新发现的数据更新数据库,而不启动它自己的任何服务器进程。

在这种情况下,您设计的服务可以 运行 两个实例,因此它接受一个命令行参数,决定它是应该开始轮询 API 还是应该直接开始起床等待。你给你的服务器它自己的控制端口(通常是一个只接受本地请求,而不是来自互联网的 http 服务器),让你向它发送命令。并且,您可以通过命令行参数或环境变量使控制端口使用的端口可配置,这样您就可以启动应用程序的多个实例,每个实例都有不同的控制端口。

接下来是一系列事件:

  1. 启动一个服务器实例并将命令行参数传递给它以告诉它立即开始轮询。
  2. 在您准备好更新之前,运行会这样。
  3. 然后,当您准备好更新时,更新不会影响 运行ning 实例的本地代码,因为它的代码已经加载。
  4. 更新后,您启动服务器的第二个实例(运行使用新代码)并向其传递一个命令行参数,告诉它尚未开始轮询。此时,您有两个 运行ning 服务实例,一个(运行ning 旧代码)正在轮询 API,另一个(运行ning 新代码) code) 待命。
  5. 然后,您向每个应用程序的控制端口发送一条命令。第一个应用程序(运行宁旧代码)被告知停止轮询并关闭。第二个应用程序(运行使用新代码)被告知开始轮询。
  6. 您现在已经启动了新代码,运行宁和轮询没有任何中断。

您可以使用您最喜欢的 shell 脚本自动执行此切换。

如果您的服务器也有一个传入的 http 服务器来处理来自 internet 的请求,那么告诉第二个实例开始轮询的命令也将必须在前一个实例关闭它们之后启动其 internet 请求的 http 服务器下来。

使用负载平衡器或可动态配置的代理,您可以将两个 Web 服务器 运行 连接在不同的本地端口上,并动态更改负载 balancer/proxy 配置以将所有传入请求路由到第二个实例在关闭第一个实例之前不要错过任何传入的 Web 请求。