Node.js 任务队列:Bull、Bee-Queue、Kue 及基于 Redis 的实现

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

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

开始课程

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

推荐