JavaScript (Node.js) 任务队列:Bull、Bee-Queue 和 Kue
在现代基于 Node.js 的 Web 应用中,经常需要异步执行耗时或资源密集型操作,以避免阻塞主请求处理线程。为此,人们使用任务队列(job queues)。它们允许延迟执行工作、在多个进程之间分配负载,并在出错时提供重试处理。
在本文中,我们将介绍三种流行的 Node.js 任务队列库:Bull、Bee-Queue 和 Kue。它们都使用 Redis 作为消息代理,从而保证了高性能和可靠性。
1. Bull — 最流行且功能最丰富的库
Bull 是一个基于 Redis 构建的现代、快速且可靠的 Node.js 任务队列。它支持所有关键功能:延迟任务、重试、优先级、暂停/恢复,以及通过内置 UI 进行监控。
安装
npm install bull基本示例
const Queue = require('bull');
// 创建队列const emailQueue = new Queue('email', 'redis://127.0.0.1:6379');
// 任务处理器emailQueue.process(async (job) => { const { to, subject } = job.data; console.log(`发送邮件至 ${to}: ${subject}`); // 模拟发送 await new Promise(resolve => setTimeout(resolve, 1000)); return { success: true };});
// 添加任务emailQueue.add({ to: 'user@example.com', subject: '来自 Bull 的问候!'}, { attempts: 3, // 出错时重试 3 次 delay: 5000, // 延迟 5 秒 priority: 1 // 高优先级});Bull 的主要功能
- 重试 — 失败时自动重试,可配置延迟。
- 优先级 — 高优先级任务优先处理。
- 延迟任务 — 可设置执行前的延迟时间。
- 暂停与恢复 — 暂停队列进行维护。
- 监控 — 内置 Web 界面
bull-board。 - 事件 — 订阅事件(completed、failed、progress)。
带事件的高级示例
const Queue = require('bull');const myQueue = new Queue('myQueue');
myQueue.on('completed', (job, result) => { console.log(`任务 ${job.id} 已完成:`, result);});
myQueue.on('failed', (job, err) => { console.error(`任务 ${job.id} 失败:${err.message}`);});
myQueue.process(async (job) => { // 进度 await job.progress(50); // 执行 return { status: 'ok' };});Bull 推荐用于需要最大灵活性和现成监控工具的项目。
2. Bee-Queue — 轻量且快速的替代方案
Bee-Queue 是一个极简的任务队列,专注于性能。它比 Bull 更简单,但提供了所有基本功能:延迟任务、重试、优先级和扩展。
安装
npm install bee-queue使用示例
const Queue = require('bee-queue');
const imageQueue = new Queue('images', { redis: { host: '127.0.0.1', port: 6379 }});
// 处理器imageQueue.process(async (job) => { const { filename } = job.data; console.log(`处理图像:${filename}`); // 模拟处理 await new Promise(resolve => setTimeout(resolve, 2000)); return { processed: true };});
// 添加任务imageQueue.createJob({ filename: 'photo.jpg'}) .retries(2) .del