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

PM2多实例下的Bull Queue并发控制问题

问题

单Node实例运行这段代码时,并发量能正常控制在5:

const bullQueue = require('bull');
const queue = new bullQueue('taskqueue', {...})
const concurrency = 5;
queue.process('jobTypeA', concurrency, job => {...do something...});

但用PM2启动8个实例后,每个实例都跑5个并发,总并发直接冲到40。怎么在多实例场景下控制Bull Queue的全局并发量?

解决方案

1. 用Bull内置的全局限流(最推荐)

创建队列时配置limiter选项,直接限制整个队列的全局并发数,不管启动多少个Node实例,总并发都不会超:

const bullQueue = require('bull');
const queue = new bullQueue('taskqueue', {
  // 你的Redis连接配置
  limiter: {
    max: 5, // 全局最大并发数
    duration: 1000 // 时间窗口,这里是1秒内最多处理5个任务
  }
});

const concurrency = 5;
queue.process('jobTypeA', concurrency, job => {
  // 任务处理逻辑
});

这个机制靠Redis做全局协调,所有实例都会遵守这个限流规则,不用自己处理实例间的同步。

2. 只让一个PM2实例处理队列

通过PM2的环境变量判断实例ID,只指定一个实例(比如ID为0的)启动任务处理器,其他实例不碰队列:

const bullQueue = require('bull');
const queue = new bullQueue('taskqueue', {...});
const concurrency = 5;

// 仅PM2实例ID为0时启动处理器
if (process.env.NODE_APP_INSTANCE === '0') {
  queue.process('jobTypeA', concurrency, job => {
    // 任务处理逻辑
  });
}

这种方式简单,但缺点是如果这个实例挂了,队列就没人处理了,得靠PM2自动重启恢复,可用性稍差。

3. 集群模式配合限流

Bull本身支持集群模式,多个实例可以协同处理任务,但如果要控全局并发,还是得结合上面的limiter:

const bullQueue = require('bull');
const queue = new bullQueue('taskqueue', {
  // Redis配置
  limiter: {
    max: 5,
    duration: 1000
  }
});

const concurrency = 5;
queue.process('jobTypeA', concurrency, job => {
  // 任务处理逻辑
});

集群模式下Bull会自动通过Redis分配任务,避免重复处理,加上limiter就能保证全局并发不超。

内容的提问来源于stack exchange,提问作者izhouteng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:45:47