NestJS 独立队列
NestJS separate Queues
根据文档 NestJS Docs 有两种实现队列的方法。
使用 redis 和命名或未命名队列,例如像这里一样:Queue Redis Example or here 和 运行 与处理器在不同进程中的队列。
我最近尝试实现此处找到的第二种方式 Queues in separate processes 但我的处理器无法识别,结果为:
Error message
有没有人可以帮助我并提供一个最小的工作示例?
我看到已经有一个最近打开的问题:Queues Processes Docs Issue 但是如果有人可以帮助我或提供的线程中的这个人,我可以做一个 PR 或者官方维护者可以这样做。
提前致谢!
最好的祝福 Ragitagha
NestJS bull 包很好地包装了 bull,它为在单独进程中 运行 的作业提供支持。
要利用 bulls 自动分叉处理,您只需提供一个可以充当作业处理器的文件的路径。
创建您想要运行作业的单独文件
import { Logger } from '@nestjs/common';
import { DoneCallback, Job } from 'bull';
export default function (job: Job<{ message: string }>, cb: DoneCallback) {
Logger.verbose(`${job.data.message} (pid ${process.pid})`, `SEPARATE`);
cb(null, 'Hurrah');
}
请记住,此文件需要能够独立 运行。当然,您可以添加其他导入等,但它将 运行 在不同的进程中运行,因此您的应用程序及其资源将无法使用。
注册队列时,请指定单独文件的路径。这里我注册了2个队列。一个在与应用程序相同的过程中 运行,一个在单独的过程中 运行
@Module({
imports: [
// register root
BullModule.forRoot({
redis: {
host: 'localhost',
port: 6379,
},
}),
// register queues
BullModule.registerQueue(
{
name: 'SAME', // this will run in same process as this module
},
{
name: 'SEPARATE', // this will run in its own process
processors: [join(__dirname, 'separate.process')],
},
),
],
controllers: [AppController],
providers: [SameService],
})
export class AppModule {}
然后您可以照常解雇工作。下面我在应用程序进程中将一个作业发送到队列,然后将另一个作业放入单独的文件
@Controller()
export class AppController {
constructor(
@InjectQueue('SAME') private readonly same: Queue,
@InjectQueue('SEPARATE') private readonly separate: Queue,
) {}
@Get()
getHello(): string {
// Example of adding a job processed in same thread
this.same.add({ message: 'Knock knock.' });
// Example of adding a job processed in separate thread
this.separate.add({ message: 'FORK OFF.' });
return 'ok';
}
}
localhost:3000 然后输出
[Nest] 13400 - 08/05/2021, 16:49:18 [SAME] Knock knock. (pid 13400) +8821ms
[Nest] 2660 - 08/05/2021, 16:49:19 [SEPARATE] FORK OFF. (pid 2660)
希望对您有所帮助!
根据文档 NestJS Docs 有两种实现队列的方法。
使用 redis 和命名或未命名队列,例如像这里一样:Queue Redis Example or here
我最近尝试实现此处找到的第二种方式 Queues in separate processes 但我的处理器无法识别,结果为:
Error message
有没有人可以帮助我并提供一个最小的工作示例?
我看到已经有一个最近打开的问题:Queues Processes Docs Issue 但是如果有人可以帮助我或提供的线程中的这个人,我可以做一个 PR 或者官方维护者可以这样做。
提前致谢! 最好的祝福 Ragitagha
NestJS bull 包很好地包装了 bull,它为在单独进程中 运行 的作业提供支持。
要利用 bulls 自动分叉处理,您只需提供一个可以充当作业处理器的文件的路径。
创建您想要运行作业的单独文件
import { Logger } from '@nestjs/common';
import { DoneCallback, Job } from 'bull';
export default function (job: Job<{ message: string }>, cb: DoneCallback) {
Logger.verbose(`${job.data.message} (pid ${process.pid})`, `SEPARATE`);
cb(null, 'Hurrah');
}
请记住,此文件需要能够独立 运行。当然,您可以添加其他导入等,但它将 运行 在不同的进程中运行,因此您的应用程序及其资源将无法使用。
注册队列时,请指定单独文件的路径。这里我注册了2个队列。一个在与应用程序相同的过程中 运行,一个在单独的过程中 运行
@Module({
imports: [
// register root
BullModule.forRoot({
redis: {
host: 'localhost',
port: 6379,
},
}),
// register queues
BullModule.registerQueue(
{
name: 'SAME', // this will run in same process as this module
},
{
name: 'SEPARATE', // this will run in its own process
processors: [join(__dirname, 'separate.process')],
},
),
],
controllers: [AppController],
providers: [SameService],
})
export class AppModule {}
然后您可以照常解雇工作。下面我在应用程序进程中将一个作业发送到队列,然后将另一个作业放入单独的文件
@Controller()
export class AppController {
constructor(
@InjectQueue('SAME') private readonly same: Queue,
@InjectQueue('SEPARATE') private readonly separate: Queue,
) {}
@Get()
getHello(): string {
// Example of adding a job processed in same thread
this.same.add({ message: 'Knock knock.' });
// Example of adding a job processed in separate thread
this.separate.add({ message: 'FORK OFF.' });
return 'ok';
}
}
localhost:3000 然后输出
[Nest] 13400 - 08/05/2021, 16:49:18 [SAME] Knock knock. (pid 13400) +8821ms
[Nest] 2660 - 08/05/2021, 16:49:19 [SEPARATE] FORK OFF. (pid 2660)
希望对您有所帮助!