Node.js / Koa2服务器 - 在请求后几分钟执行一个作业

时间:2017-08-17 17:05:15

标签: javascript node.js koa koa2

我有一个Koa2 / Node.js应用程序(使用async/await),我想在请求后执行 X 分钟,其中 X 是随机分钟数从20到100不等(我想用它来向注册的用户发送自动欢迎电子邮件,让它看起来像是我个人发送的)。

所以我可以使用setTimeout来执行此操作,将计时器设置为200分钟是否合理?当然,如果我的应用程序崩溃,电子邮件将无法发送,但我会跟踪数据库中的所有注册,因此在极少数情况下我会自行发送电子邮件。

1 个答案:

答案 0 :(得分:2)

rabbitMQ 等命令队列或 Redis (包含pub / sub或SETEX)似乎是这项简单任务的开销。

对于可能有N个请求的相对较长时间的超时确实感觉有点不舒服,但Node.js setTimout()实际上是uv_timerlibuv函数的包装器,用于处理基础操作系统通知机制的大量计时器。

尽管如此,为了让事情变得尽可能简单,我会使用一个好的旧cron作业和一些隐藏精确实现的包装库。像node-schedule这样的东西可以用几行代码完成。

const schedule = require('node-schedule');

const getRandomMsAmount = (from, to) => {
  const minutes = Math.floor(Math.random() * to) + from;
  return minutes * 60 * 1000;
};

const getDateAfterMs = (ms) => {
  const nowTimestamp = Number(new Date());
  return new Date(nowTimestamp + ms);
};

const dueDate = getDateAfterMs(getRandomMsAmount(20, 100));
const emailJob = schedule.scheduleJob(dueDate, () => {
  // logging, updating database, etc.
});

如果在处理过程中出现问题,可以取消引用的作业:

emailJob.cancel();

我希望您的电子邮件也包含随机内容,因为即使是单个用户也可以在尝试不同的情况下获得多条消息 - 因此这种延迟可能只是一种烦人的体验。