Node.js 任务调度器:概述与使用示例
在现代后端开发中,经常需要按计划执行代码:发送邮件推送、清理缓存、创建数据库备份或更新聚合数据。在 Node.js 生态系统中,有多个成熟的库可用于此目的。本文将介绍任务调度的三种主要方法:经典 cron、灵活调度和任务队列。
1. node-cron — JavaScript 的经典 cron
node-cron 是一个极简的库,允许你通过标准的 cron 表达式来运行函数。它非常适合简单的周期性任务(每分钟、每小时、每天凌晨 3 点)。
安装:
npm install node-cron一个每分钟执行一次的任务示例:
const cron = require('node-cron');
cron.schedule('* * * * *', () => { console.log('任务每分钟执行一次');});cron 表达式结构:秒 分钟 小时 日 月 星期(在 node-cron 中秒是可选的)。
表达式示例:
'0 0 * * *'— 每天午夜'*/5 * * * *'— 每 5 分钟'0 9-18 * * 1-5'— 工作日每小时 9 点到 18 点'30 3 * * 0'— 每周日凌晨 3:30
该库支持表达式验证以及任务的启动/停止:
const task = cron.schedule('*/10 * * * *', () => { // 每 10 分钟执行的任务});
// 停止任务task.stop();
// 恢复任务task.start();
// 检查任务是否激活console.log(task.isStarted()); // true/false使用场景: 适用于简单的周期性操作,无需状态存储或错误处理。
2. node-schedule — 支持递归规则的灵活调度
node-schedule 是一个更强大的替代方案,不仅可以通过 cron 设置调度,还可以通过显式指定日期、星期几和时间的 JavaScript 对象来设置。
安装:
npm install node-schedule使用 cron 表达式的示例:
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', () => { console.log('每 5 分钟执行一次');});主要优势在于可以通过对象设置调度:
const job = schedule.scheduleJob({ hour: 14, minute: 30, dayOfWeek: [1, 3, 5] // 星期一、星期三、星期五}, () => { console.log('工作日 14:30');});还可以在特定日期安排一次性任务:
const date = new Date(2025, 11, 31, 23, 59, 0);
schedule.scheduleJob(date, () => { console.log('新年到了!');});该库支持取消任务和检查下次执行时间:
// 取消任务job.cancel();
// 获取下次执行日期console.log(job.nextInvocation()); // Date 对象使用场景: 需要精确时间控制、组合规则或一次性任务时。
3. Bull — 带调度和重试机制的任务队列
Bull 是一个基于 Redis 的完整队列系统,包含强大的调度器。Bull 不仅可以延迟任务,还可以管理重试、优先级和并行执行。
安装:
npm install bull一个包含延迟任务的基本队列示例:
const Queue = require('bull');
const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 63