Node.js 任务调度器:node-cron、node-schedule 和 Bull

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐