任务队列
队列是一种强大的设计模式,可帮助您应对常见的应用程序扩展和性能挑战。队列可以帮助您解决的一些问题:
- 平滑处理峰值。可以在任意时间启动资源密集型任务,然后将这些任务添加到队列中,而不是同步执行。让任务进程以受控方式从队列中提取任务。也可以轻松添加新的队列消费者以扩展后端任务处理。
- 分解可能会阻塞 Node.js 事件循环的单一任务。比如用户请求需要像音频转码这样的 CPU 密集型工作,就可以将此任务委托给其他进程,从而释放面向用户的进程以保持响应。
- 提供跨各种服务的可靠通信渠道。例如,您可以在一个进程或服务中排队任务(作业),并在另一个进程或服务中使用它们。在任何流程或服务的作业生命周期中完成、错误或其他状态更改时,您都可以收到通知(通过监听状态事件)。当队列生产者或消费者失败时,它们的状态被保留,并且当节点重新启动时任 务处理可以自动重新启动。
Midway 提供了 @midwayjs/bullmq
包作为 BullMQ 之上的抽象/包装器。BullMQ 是 Bull 的下一代实现,提供了更好的性能和更多的功能。该软件包可以轻松地将 BullMQ 以友好的方式集成到您的应用程序中。
BullMQ 使用 Redis 来保存作业数据,在使用 Redis 时,Queue 架构是完全分布式,和平台无关。例如,您可以在一个(或多个)节点(进程)中运行一些 Queue 生产者、消费者,而在其他节点上的运行其他生产者和消费者。
提示
BullMQ 是一个分布式任务管理系统,必须依赖 redis
警告
由于 BullMQ 是 Bull 的升级版,从 v3.20 开始,将由 BullMQ 替代 Bull 组件,如需使用 Bull 组件,请参考 Bull 文档
相关信息:
描述 | |
---|---|
可用于标准项目 | ✅ |
可用于 Serverless | ❌ |
可用于一体化 | ✅ |
包含独立主框架 | ✅ |
包含独立日志 | ✅ |
安装组件
$ npm i @midwayjs/bullmq@3 --save
或者在 package.json
中增加如下依赖后 ,重新安装。
{
"dependencies": {
"@midwayjs/bullmq": "^3.0.0",
// ...
},
}
使用组件
将 bullmq 组件配置到代码中。
import { Configuration } from '@midwayjs/core';
import * as bullmq from '@midwayjs/bullmq';
@Configuration({
imports: [
// ...
bullmq
]
})
export class MainConfiguration {
//...
}
一些概念
BullMQ 将整个队列分为以下几个部分:
- Queue:队列,管理任务
- Job:每个任务对象,可以对任务进行启停控制
- Worker:任务处理器,实际的逻辑执行部分
- QueueEvents:队列事件,用于监听任务状态变化
- FlowProducer:任务流生产者,用于创建任务依赖关系