我有一个Koa2 / Node.js应用程序(使用async/await
),我想在请求后执行 X 分钟,其中 X 是随机分钟数从20到100不等(我想用它来向注册的用户发送自动欢迎电子邮件,让它看起来像是我个人发送的)。
所以我可以使用setTimeout
来执行此操作,将计时器设置为200分钟是否合理?当然,如果我的应用程序崩溃,电子邮件将无法发送,但我会跟踪数据库中的所有注册,因此在极少数情况下我会自行发送电子邮件。
答案 0 :(得分:2)
rabbitMQ 等命令队列或 Redis (包含pub / sub或SETEX
)似乎是这项简单任务的开销。
对于可能有N个请求的相对较长时间的超时确实感觉有点不舒服,但Node.js setTimout()
实际上是uv_timer
中libuv
函数的包装器,用于处理基础操作系统通知机制的大量计时器。
尽管如此,为了让事情变得尽可能简单,我会使用一个好的旧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();
我希望您的电子邮件也包含随机内容,因为即使是单个用户也可以在尝试不同的情况下获得多条消息 - 因此这种延迟可能只是一种烦人的体验。