JavaScript (Node.js) 任务队列:Bull、Bee-Queue、Kue

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

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

开始课程

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

推荐