节点服务器重启后运行Cron Jobs(波动性,可恢复性,持久性)

时间:2017-06-28 14:07:05

标签: javascript events cron save restore

我在NPM中使用cron库。

我想为用户创建事件,创建预计在事件发生后一个月内执行的作业。

让我们说这是我的代码:

function userSignedUpEvent(user) {
  var today = new Date();
  today.setDate(today.getDate() + 30);

  let cronSignature = `${today.getMinutes()} ${today.getHours()} ${today.getDate()} ${today.getMonth()} *`
  let reminderJob = new CronJob(cronSignature,
    () => {
      user.sendEmail("It has been a month since you joined us!");
    }, null, true, "Asia/Jerusalem");
}

问题是如果服务器在cron签名的确切时间关闭,代码将永远不会被执行。

我的情况是否有办法保存这些作业并在服务器再次启动时再次签名?

理论上,我可以将他们的签名保存在我的数据库中并自己实现,但我想确保没有驱动方法来实现它。

2 个答案:

答案 0 :(得分:0)

正如您所提到的,您必须以某种方式将其记录为“已完成”。

我不相信cron包提供任何直接的方法。

有很多方法。如果您已经在使用具有用户特定数据的数据库,那肯定是存储它的最合理的地方。

另一种选择是将其存储在某种平面文件中。

另一种方法可能是建立一个队列,在完成任务时读取作业。

当用户注册时,您可以将它们的记录添加到队列的底部,可能还有一个时间戳,因为在运行之前会有很长的延迟。这意味着队列将按时间顺序排列,最快的项目位于顶部,最新位于底部。

队列背后的技术有点无关紧要。它可以像纯文本文件一样简单,也可以像Kafka queue

那样复杂

然后你的程序可以经常查看队列的第一行。如果该项目已准备就绪,请执行您需要执行的操作,然后将其从队列中删除。如果没有,请不要管它并在一段时间后再次检查。

这样,该项目在完成之前仍然在队列中,即使你的程序在启动时关闭,它仍然会在启动时启动。

答案 1 :(得分:0)

所以我在这个项目中实现了这个: crone-durability