【问题标题】:Doing tasks before heroku nodejs server is ready在 heroku nodejs 服务器准备好之前执行任务
【发布时间】:2019-10-22 05:11:43
【问题描述】:

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

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

基本上在服务器准备好之前做一些nodejs工作。

我尝试了一种天真的方法:

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

但是一旦新版本发布,任务期间的所有https请求都不起作用,而是被重定向到旧版本。

我已阅读https://devcenter.heroku.com/articles/release-phase,但这看起来我只能运行一个对我不利的外部脚本,因为我的任务是设置缓存变量。

我知道这可以通过 App Engine 上的 /check_readiness 实现,但我想知道 Heroku。

【问题讨论】:

  • 为什么不使用preboot?您可以完成所有任务,然后进行端口绑定,这将确保在您的新服务完成任务后有新请求出现

标签: node.js express heroku


【解决方案1】:

您有几个选择。

    1234563并作为您的测功机启动。例如,您可以在构建周期中运行一个任务,该任务获取数据并将其存储/缓存为您在启动时读取的应用中的文件。
  1. 如果此数据更频繁地更改(例如每天),您可以利用“预启动”来捕获和缓存每个测功机的数据。根据您的应用程序的数据和架构,您可能希望在运行多个测功机时谨慎使用这种方法,因为每个测功机都将拥有独立获取的数据,因此这些数据可能在您的应用程序实例之间不匹配。这可能会导致微妙的、难以诊断的错误。

    如果您需要,例如,预缓存较大的数据块,然后在每个请求的基础上仅获取新数据(例如,在启动时获取 RSS 提要中的最后 1,000 个帖子),这是一个很好的选择,然后根据请求获取任何更新的内容(可能少于几个新条目)并合并数据以返回给客户端)。

Here's the documentation on customizing a build process for Node.js on Heroku.

Here's the documentation for enabling and working with Preboot on Heroku

【讨论】:

    【解决方案2】:

    我认为这样做不是一个好方法。您可以使用外部脚本 ( npm script ) 执行此任务,然后使用发布阶段。这里的情况与运行迁移非常相似,您可以将所需的库加载到脚本中,您甚至可以将所有应用程序加载到脚本中而无需监听端口让我们通过示例更清楚地说明

    //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');
    

    然后在“脚本”中的 packege.json 中添加此脚本,假设您将其命名为 set_cache

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

    现在您可以使用 npm 以 npm set_cache 运行此脚本并在 Procfile 中使用此命令

    web: npm start 
    release: npm set_cache 
    

    【讨论】:

    • 我无法在网络进程中使用缓存变量...这是我需要的。
    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2015-07-01
    • 2014-08-26
    • 1970-01-01
    相关资源
    最近更新 更多