TypeScript 任务队列:Bull 和 Bee-Queue 完全指南
在开发基于 TypeScript 的现代 Web 应用程序时,经常需要异步执行耗时或资源密集型操作,而不阻塞主线程。例如:发送电子邮件通知、生成 PDF 报告、处理图像或与外部 API 同步。为了解决这些问题,我们使用任务队列(job queues)。在本文中,我们将详细介绍 TypeScript 最流行的两个库——Bull 和 Bee-Queue,并讲解如何将它们集成到您的项目中。
为什么需要任务队列?
任务队列允许您:
- 分离职责——主服务仅负责提交任务,而处理器负责执行任务。
- 管理负载——可以限制并行任务的数量(并发)。
- 保证交付——即使进程崩溃,任务也不会丢失(得益于 Redis)。
- 计划执行——将任务延迟到特定时间,或按计划重复执行。
- 处理错误——自动重试(retry),并带有指数退避延迟。
Bull——Node.js 和 TypeScript 最流行的队列
Bull 是一个基于 Redis 的强大库,支持全套功能:优先级、重试、延迟、暂停、事件和监控。Bull 为 TypeScript 提供了出色的类型定义。
安装与配置
npm install bull @types/bull一个用于发送电子邮件的简单队列示例:
import Queue from 'bull';
interface EmailJob { to: string; subject: string; body: string;}
// 创建一个名为 'email' 的队列const emailQueue = new Queue<EmailJob>('email', { redis: { host: 'localhost', port: 6379 }, defaultJobOptions: { attempts: 3, // 最多尝试 3 次 backoff: { type: 'exponential', delay: 2000 }, removeOnComplete: true, }});
// 处理器——在后台执行emailQueue.process(async (job) => { console.log(`正在发送邮件至 ${job.data.to}`); // 模拟发送 await new Promise(resolve => setTimeout(resolve, 1000)); console.log(`邮件已发送:${job.data.subject}`);});
// 添加任务async function addEmail() { await emailQueue.add({ to: 'user@example.com', subject: '来自队列的问候!', body: '这是一封测试邮件。', });}
addEmail();Bull 的高级功能
- 重复任务(cron):
queue.add(data, { repeat: { cron: '0 8 * * *' } }) - 优先级:
queue.add(data, { priority: 1 })——数字越小,优先级越高。 - 延迟执行:
queue.add(data, { delay: 60000 })——延迟 1 分钟。 - 事件:可以订阅
completed、failed、progress等事件。 - 暂停/恢复:
queue.pause()/queue.resume()。
// 事件处理emailQueue.on('completed', (job, result) => { console.log(`任务 ${job.id} 已完成`);});
emailQueue.on('failed', (job, err) => { console.error(`任务 ${job.id} 失败:${err.message}`);});Bee-Queue——轻量级替代方案
Bee-Queue 是一个基于 Redis 的极简队列,比 Bull 更简单,内存消耗更少。适用于小型项目或不需要复杂配置的场景。
安装与示例
npm install bee-queueimport Bee from 'bee