的Node.js/Koa2服务器 - 要求
问题描述:
后执行作业分钟,我有(使用async/await
)一Koa2/Node.js的应用程序,我想以后的请求X分钟执行作业,其中X是随机分钟数从20到100不等(我想用它发送自动欢迎电子邮件给注册用户,并使其看起来像是由我亲自发送的)。的Node.js/Koa2服务器 - 要求
所以,我可以只使用setTimeout
来做到这一点,设置一个200分钟的计时器是否合理?当然,如果我的应用程序崩溃,电子邮件将不会被发送,但我会跟踪数据库中的所有注册,所以在极少数情况下,我会自己发送电子邮件。
答
命令队列,例如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();
我希望你的电子邮件包含随机内容为好,因为即使单个用户可以在不同的注册的情况下获得的多个消息尝试 - 所以这个延迟可能会变成一个令人讨厌的经历。
为什么不使用SendGrid并创建模板,以便电子邮件进程实现自动化并且即时发送电子邮件。更好的用户体验,然后等待100分钟才能使用您刚注册的新网站。 – VtoCorleone
其实我使用SendGrid,电子邮件过程是自动的,我只是想自动化延迟。并使它看起来像它是由人发送的,而不是bot。 –
如果可以的话,一个时间工作会比setTimeout更好。 – VtoCorleone