Node.js 十大定时任务/调度库对比
BullMQ、Agenda、Bree、node-cron……Node.js 定时任务库百花齐放。本文对比十大主流调度库的功能、存储后端与适用场景,帮你一次选对。
简单定时任务用 node-cron(轻量 cron 语法)即可;需要持久化、重试、分布式多实例协作的生产级任务队列选 BullMQ(Redis)或 Agenda(按版本选择持久化后端);Bree 适合需要 Worker 线程隔离的场景。选型核心就一个问题:任务丢了/重复了会不会出事——会就需要持久化、幂等与恢复对账设计;持久化队列也不保证业务恰好执行一次。
十大库速览
1. BullMQ
Redis 驱动的任务队列标杆:延迟任务、定时任务、重试、并发控制、优先级、Web 监控面板(Taskforce.sh 等)一应俱全。多实例部署时靠 Redis 协调 worker,但 stalled job 恢复和重试仍可能重复执行,业务必须幂等。生产级异步任务的首选。
2. Agenda
传统版本以 MongoDB 为后端,当前官方版本也提供 PostgreSQL、Redis 后端;须按安装版本核对 API。使用 MongoDB 后端时无需引入 Redis。支持 cron 语法、任务持久化、并发限制及多 worker 协作。
3. Bree
基于 Worker 线程的任务调度器:每个任务跑在独立线程,CPU 密集任务的 JavaScript 执行移出主事件循环,但仍共享进程和主机资源。自带 cron 解析、任务校验。适合"定时跑重计算"的场景。
4. node-schedule
纯内存 cron 调度,语法灵活(支持对象式规则)。进程重启任务表清空——适合可接受漏跑,或由外部机制负责持久化与恢复的任务,不能仅按开发/生产环境划分。
5. Cron(cron 包)
经典 cron 库,支持秒级粒度和时区设置。纯内存,定位与 node-schedule 相同。
6. CronosJS
现代 TypeScript cron 库,API 简洁、类型友好,支持 cron 表达式扩展语法。轻量纯内存方案中的新选择。
7. node-cron
轻量 cron 实现,API 简洁:cron.schedule('* * * * *', fn)。快速脚本和小工具的甜点。
8. Croner
零依赖、跨运行时(Node/Deno/Bun/浏览器)的 cron 库,支持秒级、时区、夏令时正确处理。需按实际表达式、时区及夏令时边界验证行为。
9. Bottleneck
严格说它限流器而非调度器:控制任务执行速率(每秒 N 次)、并发数、优先级队列。调用第三方限流 API 时的标配,常与真调度库搭配使用。
10. Toad-scheduler
简单的声明式任务注册库,支持 cron 与间隔任务,定位与 node-cron 类似,TypeScript 支持更好。
选型决策树
任务进程重启后必须还在?──否──→ node-cron / Croner(纯内存搞定)
│是
任务需要多实例分布式执行?──否──→ Agenda(有 Mongo)/ BullMQ
│是
↓
BullMQ / Agenda(按存储、锁与恢复需求评估)
CPU 密集任务再加一个维度:用 Bree 把任务扔进 Worker 线程,避免阻塞事件循环。
常见问题(FAQ)
Q:多实例部署时定时任务会重复执行吗?
未配置协调的独立进程内调度通常会各自触发。当前 node-cron 文档也提供显式 distributed 协调选项,须按安装版本与协调器配置验证;这不等同于持久化任务队列。BullMQ/Agenda 靠共享存储协调执行,但锁失效、崩溃恢复或重试仍可能导致重复业务效果,须保证幂等。如果坚持用内存库,需要外部机制保证只有一个实例调度(如 leader 选举或拆出独立调度服务)。
Q:错过执行时间的任务会补跑吗?
纯内存库不会(进程停了任务就没了)。BullMQ 旧 repeat 任务不会为 worker 停机期间的每个时间点累计补跑;5.16 起推荐 Job Schedulers,6.x 移除旧 repeat API,新机制同样受处理进度影响。Agenda 按版本、已存 next-run 状态与规则决定恢复行为,不能承诺补齐每次漏跑。对"漏跑"敏感的业务(日终结算)必须选持久化方案并自建对账检查。
Q:秒级定时选哪个?
标准 cron 最小粒度是分钟;node-cron、Cron、Croner、BullMQ 都支持秒级表达式。但秒级任务更要考虑持久化和并发控制——高频任务堆积时的表现比语法支持更重要。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。