2017-08-17 45 views
1

后执行作业分钟,我有(使用async/await)一Koa2/Node.js的应用程序,我想以后的请求X分钟执行作业,其中X是随机分钟数从20到100不等(我想用它发送自动欢迎电子邮件给注册用户,并使其看起来像是由我亲自发送的)。的Node.js/Koa2服务器 - 要求

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

+0

为什么不使用SendGrid并创建模板,以便电子邮件进程实现自动化并且即时发送电子邮件。更好的用户体验,然后等待100分钟才能使用您刚注册的新网站。 – VtoCorleone

+0

其实我使用SendGrid,电子邮件过程是自动的,我只是想自动化延迟。并使它看起来像它是由人发送的,而不是bot。 –

+0

如果可以的话,一个时间工作会比setTimeout更好。 – VtoCorleone

回答

2

命令队列,例如RabbitMQ的或环绕Redis的(与发布/订阅或SETEX)似乎是这样的简单任务的开销。

超时与潜在的N个请求相对长时间做觉得有点不舒服,但Node.js的setTimout()实际上是libuv周围uv_timer功能的包装物,设计了底层操作系统的通知机制来处理庞大的定时器量。

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

我希望你的电子邮件包含随机内容为好,因为即使单个用户可以在不同的注册的情况下获得的多个消息尝试 - 所以这个延迟可能会变成一个令人讨厌的经历。