任务队列
队列是一种强大的设计模式,可帮助您应对常见的应用程序扩展和性能挑战。队列可以帮助您解决的一些问题。
示例如下:
- 平滑处理峰值。可以在任意时间启动资源密集型任务,然后将这些任务添加到队列中,而不是同步执行。让任务进程以受控方式从队列中提取任务。也可以轻松添加新的队列消费者以扩展后端任务处理。
- 分解可能会阻塞 Node.js 事件循环的单一任务。比如用户请求需要像音频转码这样的 CPU 密集型工作,就可以将此任务委托给其他进程,从而释放面向用户的进程以保持响应。
- 提供跨各种服务的可靠通信渠道。例如,您可以在一个进程或服务中排队任务(作业),并在另一个进程或服务中使用它们。在任何流程或服务的作业生命周期中完成、错误或其他状态更改时,您都可以收到通知(通过监听状态事件)。当队列生产者或消费者失败时,它们的状态被保留,并且当节点重新启动时任务处理可以自动重新启动。
Midway 提供了 @midwayjs/bull 包作为 Bull 之上的抽象/包装器,Bull 是一种流行的、受良好支持的、高性能的基于 Node.js 的队列系统实现。该软件包可以轻松地将 Bull Queues 以友好的方式集成到您的应用程序中。
Bull 使用 Redis 来保存作业数据,在使用 Redis 时,Queue 架构是完全分布式,和平台无关。例如,您可以在一个(或多个)节点(进程)中运行一些 Queue 生产者、消费者,而在其他节点上的运行其他生产者和消费者。
本章介绍 @midwayjs/bull 包。我们还建议阅读 Bull 文档 以了解更多背景和具体实施细节。
提示
- 1、从 v3.6.0 开始,原有任务调度
@midwayjs/task
模块废弃,如果查询历史文档,请参考 这里。 - 2、bull 是一个分布式任务管理系统,必须依赖 redis
相关信息:
描述 | |
---|---|
可用于标准项目 | ✅ |
可用于 Serverless | ❌ |
可用于一体化 | ✅ |
包含独立主框架 | ✅ |
包含独立日志 | ✅ |
安装组件
$ npm i @midwayjs/bull@3 --save
或者在 package.json
中增加如下依赖后,重新安装。
{
"dependencies": {
"@midwayjs/bull": "^3.0.0",
// ...
},
}
使用组件
将 bull 组件配置到代码中。
import { Configuration } from '@midwayjs/core';
import * as bull from '@midwayjs/bull';
@Configuration({
imports: [
// ...
bull
]
})
export class MainConfiguration {
//...
}
一些概念
Bull 将整个队列分为三个部分
- 1、Queue 队列,管理任务
- 2、Job,每个任务对象,可以对任务进行启停控制
- 3、Processor,任务处理,实际的逻辑执行部分
基础配置
bull 是一个分布式任务管理器,强依赖于 redis,在 config.default.ts
文件中配置。
// src/config/config.default.ts
export default {
// ...
bull: {
// 默认的队列配置
defaultQueueOptions: {
redis: `redis://127.0.0.1:32768`,
}
},
}
有账号密码情况:
// src/config/config.default.ts
export default {
// ...
bull: {
defaultQueueOptions: {
redis: {
port: 6379,
host: '127.0.0.1',
password: 'foobared',
},
}
},
}
所有的队列都会复用该配置。