求推荐node定时任务框架~~
发布于 5 年前 作者 iori2882 8203 次浏览 来自 问答

谢谢大家,百度了一下,网络上推荐最多的是node-schedule,但是这个好像不维护了.agenda是不是只支持MongoDB数据库?麻烦大家帮忙推荐一个定时任务的框架! 还有一个问题,现在使用的PM2的集群模式,这样会导致同一个定时任务执行多遍的问题,现在系统访问量没有那么大,又不想单独出个服务器跑定时任务,看到有如下解决方案能行么?限定死只在PM2的0号进程执行任务! 目前使用框架express

if (process.env.NODE_APP_INSTANCE === ‘0’) { … // 执行任务 }

17 回复

试过,可行。你也可以测一下

@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验证就好了 函数计算

回到顶部