Bull for JavaScript (Node.js): 完整指南及示例

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

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

开始课程

什么是 Bull,为什么需要它?

\n\n

Bull 是一个强大且流行的库,用于在 Node.js 环境中管理任务队列(job queues)。它构建在 Redis 之上,提供了一种可靠、可扩展且灵活的方式来处理后台任务。如果你的应用程序需要执行不应阻塞主线程的操作(例如发送电子邮件、处理图像、生成 PDF、与外部 API 同步、数据解析),Bull 是理想的解决方案。

\n\n

为什么使用 Bull?

\n
    \n
  • 异步处理: 通过将繁重任务移至后台进程来减轻主服务器的负担。
  • \n
  • 可靠性: 任务存储在 Redis 中,因此在应用程序重启或工作进程崩溃时不会丢失。
  • \n
  • 重试机制: 内置支持在出错时自动重试。
  • \n
  • 调度: 能够延迟任务或按计划(cron)运行任务。
  • \n
  • 优先级: 管理任务的执行顺序。
  • \n
  • 监控: 通过内置 UI(Bull Board)轻松监控队列状态。
  • \n
\n\n

安装 Bull

\n\n

开始之前,请确保您已安装并运行 Redis。Bull 在没有 Redis 的情况下无法工作。

\n\n
    \n
  1. 安装 Redis(以 Ubuntu/Debian 为例):\n
    sudo apt update\nsudo apt install redis-server\nsudo systemctl start redis
    \n
  2. \n
  3. 通过 npm 安装 Bull:\n
    npm install bull
    \n
  4. \n
  5. 安装 Bull Board(可选,用于 Web 界面):\n
    npm install @bull-board/express @bull-board/api
    \n
  6. \n
\n\n

快速入门:第一个示例

\n\n

让我们创建一个简单的队列来发送欢迎电子邮件。

\n\n

步骤 1:创建生产者(producer.js)

\n
const 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)

\n
const 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。您将看到任务进入队列并被处理。

\n\n

Bull 的主要方法和函数

\n\n

1. new Queue(name, [options]) — 创建队列

\n

功能: 创建

推荐