gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:06:00 25 4
gpt4 key购买 nike

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

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

最佳答案

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();

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

关于javascript - Node.js/Koa2 服务器 - 在请求后几分钟执行作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45741178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com