Node.js 任务调度器:node-cron、node-schedule 和 Bull 库概览
在现代 Node.js 网页开发中,经常需要按计划或延迟执行代码。无论是发送邮件推送、清理缓存、生成报告还是同步数据,都离不开可靠的任务调度器。在本文中,我们将分析三种流行的工具:node-cron、node-schedule 和 Bull。您将了解它们的特点、使用示例,并明白如何根据您的任务选择最合适的工具。
1. node-cron — Node.js 的经典 Cron 实现
node-cron 是一个极简的库,实现了 Unix 调度器 cron 的语法。它非常适合简单的重复性任务。
安装
npm install node-cron示例:每分钟执行一次的任务
const cron = require('node-cron');
cron.schedule('* * * * *', () => { console.log('任务每分钟执行一次');});Cron 表达式格式
表达式由 5 个字段组成:
秒 (0-59, 可选)分钟 (0-59)小时 (0-23)月份中的日期 (1-31)月份 (1-12)星期几 (0-7, 0 和 7 表示星期日)
高级示例:每天早上 8:30
cron.schedule('30 8 * * *', () => { // 发送晨间统计报告 sendMorningReport();});特点
- 通过
timezone选项支持时区 - 支持启动和停止任务
- 轻量级(约 20 KB)
- 不适合带有队列的复杂逻辑
2. node-schedule — 具有循环规则的灵活调度器
node-schedule 提供了更丰富的 API:可以通过对象而不是仅 cron 字符串来设置调度。这对于复杂场景(例如“每月第二个星期二下午 3:00”)非常方便。
安装
npm install node-schedule示例:按 cron 表达式执行的任务
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', () => { console.log('每 5 分钟启动一次');});示例:通过对象定义循环规则
const rule = new schedule.RecurrenceRule();rule.dayOfWeek = [1, 3, 5]; // 周一、周三、周五rule.hour = 10;rule.minute = 30;
schedule.scheduleJob(rule, () => { console.log('工作日 10:30 执行的任务');});示例:延迟启动
const date = new Date(Date.now() + 5000); // 5 秒后schedule.scheduleJob(date, () => { console.log('5 秒后的一次性任务');});特点
- 灵活的规则设置(星期几、月份、范围)
- 支持按日期的一次性任务
- 可以取消任务:
job.cancel() - 不支持集群和队列
3. Bull — 带有调度器和重试功能的强大队列
Bull 不仅仅是一个调度器,而是一个基于 Redis 的完整队列系统。它非常适合生产环境:支持延迟任务、错误重试、优先级和并行处理。
安装
npm install bull# 需要安装 Redis示例:带延迟的简单任务
const Queue = require('bull');const myQueue = new Queue('myQueue', 'redis://127.0.0.1:6379');
// 添加一个延迟 1 小时的任务myQueue.add({ email: 'user@example.com' }, { delay: 3600000 });
// 处理器myQueue.process(async (job) => { console.log(`正在发送邮件给 ${job.data.email}`); await sendEmail(job