在Heroku上使用Node.js服务器之前执行任务

6

部署新版本时,我希望我的服务器在实际发布并监听HTTP请求之前执行一些任务。

假设这些任务需要大约一分钟的时间,并设置了一些变量:在任务完成之前,我希望用户被重定向到旧版本。

基本上在服务器准备就绪之前进行一些nodejs工作。

我尝试了一种简单的方法:

doSomeTasks().then(() => {
  app.listen(PORT);
})

但是,一旦新版本发布,所有任务期间的https请求都无法工作,而不是重定向到旧版本。
我已经阅读了 https://devcenter.heroku.com/articles/release-phase ,但这似乎只能运行外部脚本,对我来说并不好,因为我的任务正在设置缓存变量。
我知道这在App Engine中可以通过/check_readiness实现,但我想知道在Heroku上是否也可以实现。

1
为什么不使用 preboot?您可以完成所有任务,然后进行端口绑定,这将确保新请求在您的新服务完成任务后到来。 - Tarun Lalwani
2个回答

4

我认为这种方法并不好。你可以使用外部脚本(npm脚本)来执行此任务,然后在发布阶段使用它。这里的情况非常类似于运行迁移,你可以在脚本中引用所需的库,甚至可以加载整个应用程序到脚本而不监听端口。举个例子来让它更清晰。

//script file 
var client = require('cache_client');
// and here you can require all the needed libarires to the script 
// then execute your logic using sync apis 
client.setCacheVar('xyz','xyz');

然后在 package.json 文件中的 "scripts" 部分添加以下脚本,假设你命名为 set_cache:

    "scripts": {
    "set_cache": "set_cache",
  },

现在你可以使用npm运行此脚本,命令为npm set_cache并在Procfile中使用此命令。
web: npm start 
release: npm set_cache 

我将无法在Web进程中使用缓存变量...这正是我所需要的。 - httpete

4

你有几个选项。

  1. 如果你所做的工作只在发布时更改,你可以添加一个任务作为你的 dyno 构建阶段的一部分,在编译后的 slug 中获取并存储数据,这些数据将部署到 Heroku 上的虚拟容器中,并作为你的 dyno 启动。例如,你可以在构建周期中运行一个任务,获取数据并将其存储/缓存为应用程序中的文件,在启动时读取它。

  2. 如果这些数据更频繁地更改(例如每天),你可以利用“preboot”以基于每个 dyno 的方式捕获和缓存这些数据。根据你的应用程序的数据和架构,当运行多个 dynos 时,你可能需要小心采用此方法,因为每个 dyno 都会独立地获取数据,因此该数据在应用程序实例之间可能不匹配。这可能会导致微妙、难以诊断的错误。

    如果你需要预先缓存较大量的数据,然后在每个请求上仅获取新数据(例如,在启动时获取 RSS 订阅中最近的 1,000 篇文章,然后在请求中获取任何更新的内容——这可能少于几篇新文章——并合并数据返回给客户端),那么这是一个很好的选择。

这是关于在 Heroku 上自定义 Node.js 构建过程的文档。

这是关于启用和使用 Heroku 上的 Preboot 的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接