【发布时间】:2021-11-28 00:06:57
【问题描述】:
我正在 Node.js 中使用 expressjs 编写 HTTP API,这就是我想要实现的目标:
- 我有一个常规任务,我想定期运行,大约每分钟运行一次。此任务使用名为
task的异步函数实现。 - 作为对 API 调用的反应,我也希望立即调用该任务
-
task函数的两次执行不能同时执行。每次执行都应该在另一个执行开始之前运行完成。
代码如下所示:
// only a single execution of this function is allowed at a time
// which is not the case with the current code
async function task(reason: string) {
console.log("do thing because %s...", reason);
await sleep(1000);
console.log("done");
}
// call task regularly
setIntervalAsync(async () => {
await task("ticker");
}, 5000) // normally 1min
// call task immediately
app.get("/task", async (req, res) => {
await task("trigger");
res.send("ok");
});
我在https://github.com/piec/question.js 放了一个完整的工作示例项目
如果我在 go,我会像 this 那样做,这很容易,但我不知道如何使用 Node.js。
我考虑过或尝试过的想法:
- 我显然可以使用async-mutex 库中的互斥锁将
task放在关键部分。但我不太喜欢在 js 代码中添加互斥锁。 - 许多人似乎在使用带有工作进程(bee-queue、bulmq、...)的消息队列库,但这通常会增加对外部服务(如 redis)的依赖。此外,如果我是正确的,代码会更复杂一些,因为我需要一个主入口点和一个用于工作进程的入口点。此外,您不能像在“正常”单进程情况下那样轻松地与工作人员共享对象。
- 我已经尝试RxJs subject 来创建一个生产者消费者频道。但我无法将
task的执行限制为一次执行一个(task是异步的)。
谢谢!
【问题讨论】:
标签: node.js rxjs message-queue producer-consumer