Docker多容器部署NestJS+Bull任务队列:特定容器绑定指定Worker的问题求助
Docker多容器部署NestJS+Bull任务队列:特定容器绑定指定Worker的问题求助
我最近在搭建一个基于NestJS+Bull的Docker化任务队列应用,目标是实现1个Web服务容器、1个Redis容器,以及两个分别处理慢任务和快任务的Worker容器,但遇到了一堆棘手的问题,实在搞不定了,来求助大家!
遇到的具体问题:
- 有时候Worker容器启动后直接以退出码0结束,根本没正常运行
- 调整一些配置后,发起任务请求时完全没有任何响应
- 还有情况是两个Worker容器会处理同一个任务队列,没法做到特定容器绑定指定Worker的预期目标
以下是我的相关配置:
1. Docker Compose配置
version: '3.8' services: web: build: context: . dockerfile: Dockerfile ports: - '3000:3000' depends_on: - redis environment: - NODE_ENV=production hostname: my-web-container worker-one: build: context: . dockerfile: src/workers/worker-one/worker-one.dockerfile depends_on: - redis hostname: my-slow-container environment: REDIS_HOST: redis REDIS_PORT: 6379 REDIS_QUEUE_NAME: one worker-two: build: context: . dockerfile: src/workers/worker-two/worker-two.dockerfile depends_on: - redis hostname: my-fast-container environment: REDIS_HOST: redis REDIS_PORT: 6379 REDIS_QUEUE_NAME: fast # 随便选的唯一名称 redis: image: redis:alpine ports: - '6379:6379'
2. Worker代码示例(WorkerOne,WorkerTwo逻辑类似)
import { Process, Processor } from '@nestjs/bull'; import { Job } from 'bull'; @Processor('one') export class WorkerOne{ @Process('slow-job') async handleJob(job: Job<unknown>): Promise<void> { console.log(`Processing slow-job, data: ${JSON.stringify(job.data)}`); await new Promise((resolve) => setTimeout(resolve, 5000)); // 模拟慢处理 console.log(`Slow-job done!`); } }
3. Worker的Dockerfile(以worker-one为例)
FROM node:14 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["npm", "run", "start:one"]
4. 任务服务(JobService)代码
import { Injectable } from '@nestjs/common'; import { InjectQueue } from '@nestjs/bull'; import { Queue } from 'bull'; @Injectable() export class JobService { constructor( @InjectQueue('one') private readonly oneQueue: Queue, @InjectQueue('two') private readonly twoQueue: Queue, ) {} async addJob(data: any): Promise<void> { if (data.name === 'userOne') { console.log('slower'); await this.oneQueue.add('slow-job', data); } else { console.log('faster'); await this.twoQueue.add('fast-job', data); } } }
5. WorkersModule配置(已导入到AppModule)
import { Module } from '@nestjs/common'; import { BullModule } from '@nestjs/bull'; import { JobController } from './controllers/job.controller'; import { JobService } from './services/job.service'; @Module({ imports: [ BullModule.forRoot({ redis: { host: 'redis', port: 6379, }, }), BullModule.registerQueue( { name: 'one', }, { name: 'two', }, ), ], controllers: [JobController], providers: [JobService], }) export class WorkersModule {}
6. package.json中的启动脚本
"start:one": "node dist/main slow",
我也试过把start:one改成直接指向特定Worker的路径,但也没用。
有没有大佬能帮我诊断下问题所在?怎么才能让每个Worker容器只处理指定的任务队列,同时保证容器能正常运行、任务能被正确处理呢?
备注:内容来源于stack exchange,提问作者Мариян Соколов
相关产品推荐
相关产品推荐

