您可以使用该文档来实现整个 worker。如果您在独立模式下使用 Nest.js,您只需要拥有处理器和进程。
这在此处有记录。 "单独的二进制文件"也不是问题。二进制文件是编译的产品,Node.js没有编译,因此您需要一个单独的应用程序。
您不需要任何解决方法,这实际上就是 Bull 和可选的 Nest.js 的本质。
有时您需要调整文档中的示例以适应您的需求,这可能需要一些时间来学习。
术语
我认为术语存在一些混淆,因此在本文章中请假设:
process
是您的 application
在其中运行的内容(如果您查看操作系统进程管理器,它应该是 node
)。
application
是运行在单独的 process
中的一个 Node.js 项目。
worker
是仅专注于处理队列任务的 application
。
Queue
和 Job
是 Bull 的术语。
Processor
和 Process
是 Nest.js 的 @nestjs/bull
的术语。
解决方案
以下是如何创建一个分别运行在独立进程中的 application 与 worker。按照以下说明后,您应该会在操作系统进程管理器中看到两个进程在运行。
创建一个新的 Nest.js 应用程序,我们将用它来制作您的 worker
:
nest new my-worker
打开 src/main.ts
文件并将 bootstrap
函数中的所有内容替换为:
const app = await NestFactory.createApplicationContext(AppModule);
使用以下命令安装Bull
和Nest.js实现:
yarn add @nestjs/bull bull
打开 src/app.module.ts
文件并从 controllers
中移除 AppController
,然后将 BullModule.registerQueue
添加到导入中(来自 @nestjs/bull
)。
你的 src/app.module.ts
现在应该是这样的:
@Module({
imports: [
BullModule.registerQueue({
name: 'my-queue',
redis: {
host: 'localhost',
port: 6379,
},
}),
],
})
export class AppModule {}
在
src
目录中创建一个名为
app.processor.ts
的新文件:
Create a new file: app.processor.ts
in src
directory:
@Processor('my-queue')
export class AppConsumer {
@Process('namedjob')
async processNamedJob(job: Job<any>): Promise<any> {
}
}
然后在“worker”方面,您就完成了。现在您需要做的是在您的“应用程序”(主项目)中更新您的AppModule
以包含BullModule.registerQueue
(如上所示),并注入它:
export class MyService {
constructor(@InjectQueue('my-queue') private queue: Queue) {}
}
然后使用this.queue.add('namedJob', data);
尝试上述方法,如果遇到困难,请在Github上创建一个仓库,我会帮助你找到正确的方向。
参考资料
- https://github.com/OptimalBits/bull#separate-processes
- https://docs.nestjs.com/standalone-applications