谢谢大家,百度了一下,网络上推荐最多的是node-schedule,但是这个好像不维护了.agenda是不是只支持MongoDB数据库?麻烦大家帮忙推荐一个定时任务的框架! 还有一个问题,现在使用的PM2的集群模式,这样会导致同一个定时任务执行多遍的问题,现在系统访问量没有那么大,又不想单独出个服务器跑定时任务,看到有如下解决方案能行么?限定死只在PM2的0号进程执行任务! 目前使用框架express
if (process.env.NODE_APP_INSTANCE === ‘0’) { … // 执行任务 }
试过,可行。你也可以测一下
@JianmingXia 那我也试试,好慌啊 生产环境这么用总感觉哪里有点不对 ~~~~~~~~
bull 或者 bullmq,支持定时任务用 redis。
通过redis实现锁。 如果pm号为0的进程,正好挂了,岂不是不执行了? 我之前在Laravel5.2参考新版本实现过,你可以参考下了解概念,相信你也能很容易做出来的。 Laravel-onOneServer
可以用这个 https://github.com/miaowing/nest-schedule
更多资料: https://docs.nestjs.cn/6/awesome
开启多实例的话,就得借助外部的 redis 了
@VoganWong PHP-fpm 由于没有常驻内存,做定时任务很蠢~ 参考laravel 方式只能是更麻烦~
@zuohuadong 你可能没看楼主的需求? 另外我让他参考的是使用redis锁,而不是Laravel 懂?
可以看看egg-schedule~
个人感觉蛮好用的~
@nnliang 声明式
import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
@Injectable()
export class TasksService {
private readonly logger = new Logger(TasksService.name);
@Cron('45 * * * * *')
handleCron() {
this.logger.debug('Called when the current second is 45');
}
}
动态
addCronJob(name: string, seconds: string) {
const job = new CronJob(`${seconds} * * * * *`, () => {
this.logger.warn(`time (${seconds}) for job ${name} to run!`);
});
this.scheduler.addCronJob(name, job);
job.start();
this.logger.warn(
`job ${name} added for each minute at ${seconds} seconds!`,
);
}
参考: https://docs.nestjs.com/techniques/task-scheduling 例子:https://github.com/nestjs/nest/tree/master/sample/27-scheduling
@hxddev 谢谢 我看看去
@VoganWong 十分感谢 我试试
@zuohuadong 目前使用框架express 这个是不是我用不了啊
@nnliang 目前使用框架express 好像这个我用不了
启动新的进程专门做定时任务就可以了,不要放在网站里面。
@zuohuadong 你推nest 有点上头了老哥~
不管你用什么框架, 我只看见new CronJob
就足矣~
一般,定时任务最好的单独出来一个服务,不必放新服务器,同一个服务器就好,这样用什么定时任务的库关系都不大,在小流量场景下。
可以用函数计算,建立一个定时器就可以,开放一个http触发接口,做好token验证就好了 函数计算