You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Мариян Соколов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 12:09:37