【问题标题】:Using 'cron' module in node.js on heroku server在 heroku 服务器上的 node.js 中使用“cron”模块
【发布时间】:2017-05-17 21:56:03
【问题描述】:

我在 node.js 中使用 cron 来安排一个在用户确定的时间发送文本消息的函数。它可以在我的本地服务器上运行,但是当我部署到 heroku 时,这些函数永远不会被调用。

【问题讨论】:

  • 请贴出我们需要的相关代码sn-ps,以帮助您诊断和解决问题。此外,您应该阅读这个简短的 SO 帮助页面:MCVE

标签: node.js heroku cron


【解决方案1】:

我在 heroku 上使用节点的 cron 作业。这是我的顶级内容

var CronJob = require('cron').CronJob;

var dailyJob = new CronJob({
      cronTime: '0 0 0 * * *',
      onTick: function () {
        // Do daily function
        console.log('I get called 1 time a day.');
      },
      start: false
    });

dailyJob.start();

【讨论】:

  • cron 作业是否确实可以在 heroku 服务器上运行?
  • 是的。你需要在一个不睡觉的层。
【解决方案2】:

我将详细说明上面@rsp 所说的内容,这样如果其他人发现这个问题,他们就会明白为什么在这里使用Heroku Scheduler 是正确答案。

当您在 Heroku 上运行软件时,Heroku 将获取您的项目,并在 Amazon 上 Heroku 服务器集合中的随机测功机(服务器)上运行它。

出于多种原因(包括帮助在大量 Amazon 服务器上平均分配应用程序负载),Heroku 会定期将您的 dyno 从一台 Amazon 服务器移动到另一台服务器。这每天在幕后自动发生很多次。

这意味着您的应用程序代码在 Heroku 上运行时会一直定期重启。

现在——从最终用户的角度来看,这并不是一件坏事,因为当您的应用程序代码重新启动时,Heroku 会将传入的请求排队,然后在新的应用程序成功重新启动后将它们发送到您的应用程序主持人。所以对于最终用户来说,这种行为是 100% 透明的。

不过,在这里要知道的重要一点是,由于您的应用程序代码可能会随机重新启动,因此您不应该使用它来执行诸如运行需要一段时间才能完成的长任务,或者将要在未来(cron 模块的作用)。

相反:Heroku 创建了一个免费的调度程序插件,您可以使用它基本上说“嘿 Heroku,每分钟运行一次这个 Node 脚本|小时|等等。”

Heroku 提供的调度程序插件将可靠地执行您的 cron 任务,因为 Heroku 会单独跟踪这些计时内容(在您的应用程序逻辑之外)。

希望这会有所帮助!

【讨论】:

  • 我能否允许用户使用此插件安排任务?目前,我的代码根据用户通过表单输入的内容来安排任务。谢谢。
  • 你不能。如果这是您的用例,您可能应该考虑使用 RabbitMQ 或 Amazon SQS 等队列服务。这种情况下的工作方式是,您的应用程序会将消息发送到队列(SQS / RabbitMQ / Redis / 等),然后您将运行一个单独的进程(工作人员测功机),该进程在何时处理该任务需要。对于您所描述的那种用例,这是一个更“可扩展”的解决方案。
  • @rdegges 很好的解释。我在 StackOverflow 上看到的最好的之一,干得好!
【解决方案3】:

在 Heroku 上,您可能需要使用 Heroku 调度程序。

见:https://devcenter.heroku.com/articles/scheduler

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 2016-08-30
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2015-04-26
    • 2020-04-14
    相关资源
    最近更新 更多