JavaScript (Node.js) 任务队列:Bull、Bee-Queue 和 Kue
在开发 Node.js Web 应用程序时,经常需要在 HTTP 请求处理主线程之外执行资源密集型或长时间运行的操作。发送邮件、生成 PDF 报告、处理上传的图片或与外部 API 交互——如果同步执行所有这些任务,都可能会阻塞对用户的响应。为了解决这个问题,我们使用任务队列 (job queues)。
任务队列是一种机制,它允许:
- 将工作推迟到后台执行。
- 管理任务的优先级和处理顺序。
- 在出错时自动重试任务。
- 水平扩展处理能力(多个工作进程)。
在 Node.js 生态系统中,最流行的三个库是:Bull、Bee-Queue 和 Kue。它们都构建在 Redis 之上,从而确保了高性能和容错性。下面我们来详细了解一下每一个库。
1. Bull — 最流行且功能最丰富的队列
Bull (npm: bull) 是一个成熟、文档完善的库,支持几乎所有必要的场景:延迟任务、定时重复、优先级、速率限制、错误堆栈,甚至可视化界面 (Arete)。Bull 受到社区的积极维护,推荐用于生产环境项目。
安装:
npm install bull一个简单的例子——创建队列和处理程序:
const Queue = require('bull');
// 创建一个名为 'email' 的队列const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// 添加一个任务 (job)emailQueue.add({ to: 'user@example.com', subject: '欢迎!', body: '感谢您的注册。'}, { attempts: 3, // 出错时的重试次数 backoff: 5000, // 重试间隔(5 秒) delay: 10000 // 延迟 10 秒});
// 处理程序 (工作进程)emailQueue.process(async (job) => { const { to, subject, body } = job.data; console.log(`正在向 ${to} 发送邮件:${subject}`); // 在此处调用您的邮件发送函数 await sendEmail(to, subject, body);});Bull 的关键功能:
- 重试 — 配置重试次数和指数退避延迟。
- 定时任务 (cron) — 按计划执行任务(例如,每晚执行)。
- 优先级 — 高优先级的任务会被优先处理。
- 事件 — 订阅事件(completed, failed, progress)。
- 优雅关闭 — 正确地停止运行。
2. Bee-Queue — 轻量且快速的队列
Bee-Queue (npm: bee-queue) 是 Bull 的一个极简替代方案。它只提供基本功能,但开销极低。Bee-Queue 非常适合不需要复杂配置但注重速度的简单场景。
安装:
npm install bee-queue使用示例:
const Queue = require('bee-queue');
const imageQueue = new Queue('image-processing', { redis: { host: '127.0.0.1', port: 6379 }, isWorker: true});
// 添加一个任务imageQueue.createJob({ imageId: 123, size: 'thumbnail' }) .timeout(30000) // 超时时间 30 秒 .retries(2) // 重试 2 次 .save() .then(job => console.log('任务已创建:', job.id));
// 处理程序imageQueue.process((job, done) => { console.log(`正在处理图片 ${job.data.imageId}`); // 执行工作 proce