什么是 Bull,为什么需要它?
\n\nBull 是一个强大且流行的库,用于在 Node.js 环境中管理任务队列(job queues)。它构建在 Redis 之上,提供了一种可靠、可扩展且灵活的方式来处理后台任务。如果你的应用程序需要执行不应阻塞主线程的操作(例如发送电子邮件、处理图像、生成 PDF、与外部 API 同步、数据解析),Bull 是理想的解决方案。
\n\n为什么使用 Bull?
\n- \n
- 异步处理: 通过将繁重任务移至后台进程来减轻主服务器的负担。 \n
- 可靠性: 任务存储在 Redis 中,因此在应用程序重启或工作进程崩溃时不会丢失。 \n
- 重试机制: 内置支持在出错时自动重试。 \n
- 调度: 能够延迟任务或按计划(cron)运行任务。 \n
- 优先级: 管理任务的执行顺序。 \n
- 监控: 通过内置 UI(Bull Board)轻松监控队列状态。 \n
安装 Bull
\n\n开始之前,请确保您已安装并运行 Redis。Bull 在没有 Redis 的情况下无法工作。
\n\n- \n
- 安装 Redis(以 Ubuntu/Debian 为例):\n
\nsudo apt update\nsudo apt install redis-server\nsudo systemctl start redis\n - 通过 npm 安装 Bull:\n
\nnpm install bull\n - 安装 Bull Board(可选,用于 Web 界面):\n
\nnpm install @bull-board/express @bull-board/api\n
快速入门:第一个示例
\n\n让我们创建一个简单的队列来发送欢迎电子邮件。
\n\n步骤 1:创建生产者(producer.js)
\nconst Queue = require('bull');\n\n// 创建一个名为 'emailQueue' 的队列\nconst emailQueue = new Queue('emailQueue', {\n redis: { host: 'localhost', port: 6379 }\n});\n\n// 向队列添加任务的函数\nasync function addEmailJob(to, subject, body) {\n const job = await emailQueue.add(\n { to, subject, body }, // 任务数据\n {\n attempts: 3, // 出错时的重试次数\n backoff: { type: 'fixed', delay: 5000 } // 重试之间的延迟(5 秒)\n }\n );\n console.log(`任务已添加,ID: ${job.id}`);\n return job;\n}\n\n// 使用示例\naddEmailJob('user@example.com', '欢迎!', '感谢您的注册。')\n .then(() => process.exit(0))\n .catch(err => console.error(err));\n\n\n步骤 2:创建工作进程(worker.js)
\nconst Queue = require('bull');\n\n// 连接到同一个队列\nconst emailQueue = new Queue('emailQueue', {\n redis: { host: 'localhost', port: 6379 }\n});\n\n// 任务处理器\nemailQueue.process(async (job) => {\n console.log(`正在处理任务 ${job.id}...`);\n const { to, subject, body } = job.data;\n\n // 模拟发送电子邮件(实际中请使用 nodemailer)\n await new Promise(resolve => setTimeout(resolve, 2000));\n console.log(`电子邮件已发送至 ${to}: ${subject}`);\n\n // 如果出现问题,请抛出错误\n // throw new Error('发送错误');\n});\n\nconsole.log('工作进程已启动,正在等待任务...');\n\n\n步骤 3:运行
\n首先启动工作进程:node worker.js。然后在另一个终端中启动生产者:node producer.js。您将看到任务进入队列并被处理。
Bull 的主要方法和函数
\n\n1. new Queue(name, [options]) — 创建队列
\n功能: 创建