node.js - 用于队列和 api 的嵌套公牛单独进程
问题描述
我有一个nestjs
暴露几个 RESTAPI
的应用程序。其中一个API
s 触发处理某些任务的作业。问题是当作业被触发时,应用程序停止服务 REST 请求,这导致负载均衡器的健康检查失败。我按照自述文件末尾给出的方法启动了一个单独的子进程来处理作业。但是,该作业不会在子进程中启动,并且API
请求会停止。
这是我的工作:
import {
BullQueueEvents,
OnQueueActive,
OnQueueEvent,
Process,
Processor,
} from 'nest-bull';
import { Job } from 'bull';
import { Logger } from '@nestjs/common';
import { AService } from './a-service';
import { AJobInterface } from '../AJobInterface';
@Processor({ name: 'a_queue' })
export class AJob {
private readonly logger = new Logger('AQueue');
constructor(private readonly service: AService) {}
@Process({
name: 'app',
concurrency: 1
})
processApp(job: Job<AJobInterface>) {
console.log('CHILD: ', process.pid);
const { jobId } = job.data;
return this.service.process(jobId);
}
@OnQueueActive()
onActive(job: Job) {
this.logger.log(
`Processing job ${job.id} of type ${job.name} with data ${JSON.stringify(
job.data,
)}...`,
);
}
@OnQueueEvent(BullQueueEvents.COMPLETED)
onCompleted(job: Job) {
this.logger.log(
`Completed job ${job.id} of type ${job.name} with result ${job.returnvalue}`,
);
}
}
这是我的 app.module.ts:
import { Module, OnModuleInit } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DatabaseModule } from './db/module';
import { BullModule } from 'nest-bull';
import { AJob } from './worker/a-job';
import { AService } from './worker/a-service';
import { join } from 'path';
@Module({
imports: [
TypeOrmModule.forRoot(),
DatabaseModule,
BullModule.register({
name: 'a_queue',
processors: [ join(__dirname, 'worker/a-job.js') ],
options: {
redis: {
host: process.env.REDIS_URL || '127.0.0.1',
port: 6379,
showFriendlyErrorStack: true,
},
settings: {
lockDuration: 300000,
stalledInterval: 300000
},
},
}),
],
controllers: [AppController],
providers: [AppService, AJob, AService],
})
export class AppModule implements OnModuleInit {
onModuleInit() {
console.log('MAIN: ', process.pid);
}
}
有什么我做错了吗?
解决方案
很抱歉这么晚才发布答案。事实证明,在子进程中设置工作人员是不可能的。我最终有一个单独worker.module.ts
的和一个单独的worker.ts
,并为 API 和工作人员创建了两个单独的进程。
worker.module.ts
:
import { Module, OnModuleInit } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppService } from '../app.service';
import { DatabaseModule } from '../db/module';
import { BullModule } from 'nest-bull';
import { AJob } from './a-job';
import { AService } from './a-service';
import { join } from 'path';
import { Job, DoneCallback } from 'bull';
@Module({
imports: [
TypeOrmModule.forRoot(),
DatabaseModule,
BullModule.register({
name: 'a_queue',
processors: [ (job: Job, done: DoneCallback) => { done(null, job.data); } ],
options: {
redis: {
host: process.env.REDIS_URL || '127.0.0.1',
port: 6379,
password: process.env.REDIS_PWD,
showFriendlyErrorStack: true,
},
settings: {
lockDuration: 300000,
stalledInterval: 300000
},
},
}),
],
providers: [AppService, AJob, AService],
})
export class WorkerModule implements OnModuleInit {
onModuleInit() {
console.log('WORKER: ', process.pid);
}
}
worker.ts
:
import { NestFactory } from '@nestjs/core';
import { WorkerModule } from './worker/worker.module';
async function bootstrap() {
const app = await NestFactory.create(WorkerModule);
app.init();
}
bootstrap();
虽然app.module.ts
现在看起来像这样:
//...imports
@Module({
imports: [
TypeOrmModule.forRoot(),
DatabaseModule,
BullModule.register({
name: 'a_queue',
processors: [ ],
options: {
redis: {
host: process.env.REDIS_URL || '127.0.0.1',
port: 6379,
showFriendlyErrorStack: true,
},
},
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements OnModuleInit {
onModuleInit() {
console.log('MAIN: ', process.pid);
}
}
和相应的app.ts
:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { port } from './config';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableCors();
await app.listen(port);
}
bootstrap();
推荐阅读
- javascript - 为什么 element.setAttribute('checked', true) 不起作用?
- azerothcore - AzerothCore:更改 authserver 的端口
- docker - 如何在 jboss 的standalone.xml 中的属性名称中使用环境变量?
- python - 带有重音字母的反斜杠转义字符串到 ascii
- excel - 与给定数字最接近的数字,但该数字必须在选定的变量增量内作为第二个参数
- java - 在 IntelliJ 中创建 MimeMessage 工作,卡在 .jar 中
- dll - 使用 gfortran 从 DLL 导出 COMMON 块
- vue.js - 如何在 ChartJS 中的数据上加上符号 (%)?
- php - php中有没有办法计算嵌套结构级别?
- java - 从 NVD 数据源中提取数据和 cpe_match 含义