Node.js / Koa2服务器 – 请求后执行一个工作分钟

我有一个Koa2 / Node.js应用程序(使用async/await ),我想执行一个工作X分钟后请求,其中X是一个随机数分钟范围从20 – 100(我想用它来发送自动欢迎邮件给注册的用户,并使其看起来像是由我个人发送的)。

所以我可以使用setTimeout来做到这一点,设置200分钟的定时器是否合理? 当然,如果我的应用程序崩溃,电子邮件将不会被发送,但我会跟踪数据库中的所有注册,所以在极less数情况下,我会自己发送电子邮件。

rabbitMQ这样的命令队列或者Redis (带有pub / sub或者是SETEX )似乎是这样简单任务的开销。

相对较长时间的可能有N个请求的超时感觉有点不舒服,但是Node.js的setTimout()实际上是uv_timer函数的一个包装,它被devise为处理底层OS通知机制的大量定时器。

尽pipe如此,为了让事情尽可能简单,我会使用一个很好的旧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(); 

我希望你的电子邮件也包含随机内容,因为即使单个用户可以在不同的注册尝试中获得多个消息 – 所以这个延迟可能只是一个恼人的经历。