TypeScript 任务队列:Bull、Bee-Queue 与异步处理

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

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

开始课程

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-queue


import Bee from 'bee                    

推荐