BullMQ 分布式任务队列
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/bullmq-redis-message-queue-job-processor-nodejs
技能介绍
解决什么问题
在 Node.js 服务中,当请求需要异步处理时,开发者通常会面临几个痛点:HTTP 请求不能长时间挂起,数据库事务不能无限等待,而简单的内存队列又无法应对服务重启或多实例并发。我们需要一个机制,将耗时任务(如发送邮件、生成报表、处理视频)从主请求链路中剥离,放入一个可靠、可扩展的队列中。
BullMQ 就是为解决这个问题而生的。它基于 Redis 提供高性能的分布式队列,允许我们将任务定义、调度与执行分离,保证任务在服务重启后依然不丢失,并支持多 worker 进程并行消费。
它是如何工作的
BullMQ 的核心围绕三个概念:Queue(任务队列)、Worker(消费者)和 Job(具体任务)。
- 定义任务与队列:使用
Queue实例创建一个任务队列,并向其中添加Job。每个 Job 可以携带任意 JSON 数据。 - 配置 Workers 处理任务:
Worker负责监听队列并执行任务处理逻辑。你可以在单独的进程或机器上启动多个 Worker,BullMQ 会自动进行负载均衡。 - 利用高级调度特性:
- 优先级队列:为关键任务设置更高优先级,确保它们被优先处理。
- 速率限制:控制单位时间内处理的任务数量,避免下游服务(如第三方 API)过载。
- 延迟任务:定时执行任务,例如 5 分钟后的提醒。
- 父子依赖:将复杂任务拆分为多个子任务,只有当所有子任务完成后,父任务才会开始执行。
- 可重复任务:定义一次性任务或按 Cron 表达式周期性执行的任务。
- 沙盒化工作进程:为任务处理提供隔离环境,防止单个任务的异常影响整个应用。
适用边界与注意点
BullMQ 是一个强大的工具,但并非万能。它最适合需要高吞吐量、可靠后台处理的场景。如果你的应用任务量很小,或者不需要跨实例协调,内置的简单队列可能就足够了。
此外,BullMQ 依赖 Redis,因此需要单独部署和维护 Redis 实例。在设计任务处理逻辑时,务必考虑到任务失败后的重试机制和错误处理,因为网络抖动或下游服务故障是常态。
对于非 Node.js 环境,BullMQ 提供了 BullMQ Proxy 作为兼容方案,但核心优势仍体现在 Node.js 生态中。
使用场景
- 电商促销期间,处理高并发订单时,用优先级队列确保VIP用户的支付任务优先执行
- 内容审核平台,需要对违规内容进行延迟审核,设置5分钟后自动触发审核任务
- 报表生成系统,将复杂报表拆分为多个子任务,通过父子依赖确保所有子任务完成后生成最终报表
适合人员
- Node.js后端开发工程师,负责构建高并发后台任务处理系统,需要可靠的分布式队列支撑
- 电商平台运维人员,处理促销活动中的订单任务,需要优先级调度和速率限制防止系统过载
- 数据处理团队工程师,处理批量数据同步任务,需要延迟任务和父子依赖管理复杂流程