【发布时间】:2021-06-04 15:53:01
【问题描述】:
目前,如果完成请求所需的时间大于间隔时间,长时间运行的任务将重叠(同一任务同时运行多个实例)。 下面的 NestJS 服务示例
import { Injectable, Logger } from '@nestjs/common';
import { Interval } from '@nestjs/schedule';
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let c = 1
@Injectable()
export class TasksService {
private readonly logger = new Logger(TasksService.name);
@Interval(1000)
async handleCron() {
this.logger.debug(`start ${c}`);
await timeout(3000)
this.logger.debug(`end ${c}`);
c += 1
}
}
是否可以避免这些任务重叠并且一次只调用一个实例的任务?从技术上讲,我们可以跟踪 lock 变量,但这只会允许我们跳过一个实例,如果一个实例已经在运行。理想情况下,我们可以调用 set 一个选项来允许基于任务结束时间的间隔,而不是固定间隔(也称为开始时间)。
【问题讨论】:
-
您可能应该使用发布/订阅消息传递基础架构来支持调用的动态特性。文档中“微服务”下的任何消息传递平台。或者像 EventEmitter 这样更简单的东西。
标签: javascript scheduled-tasks nestjs