PM2 Cluster 模式下 RabbitMQ 队列并行消费方案

1. PM2 Cluster 模式概念

  • PM2 会根据 CPU 核心数自动启动多个 Node.js 进程(Worker),每个进程都是独立的事件循环。
  • 每个 Worker 进程可以独立连接 RabbitMQ 并消费队列。
  • RabbitMQ 会将队列消息 公平分发给不同进程,保证不会重复投递。

优势:无需手动管理 cluster,自动利用多核 CPU,实现高并发处理。


2. 消息位置(delivery tag)在 PM2 Cluster 下的处理

  • 每个 Worker 进程独立 channel:delivery tag 是 channel 内部唯一标识。

  • 不同进程的 delivery tag 相互独立:不会冲突。

  • ack 消息:处理完成后每个 Worker 单独 ack,不影响其他进程。

  • 顺序敏感任务

    • 多进程消费时,队列内部顺序在不同进程之间不保证。

    • 解决方案:

      • 对顺序敏感的任务使用单独队列。
      • 或在 Worker 内部使用子队列顺序处理。

3. 使用 PM2 Cluster + RabbitMQ 的示例

(1)安装依赖

复制代码
npm install amqplib
npm install pm2 -g

(2)消费者示例

javascript 复制代码
// consumer.js
const amqp = require('amqplib');

async function startConsumer() {
  const conn = await amqp.connect('amqp://localhost'); // 集群模式可使用 ['amqp://node1', 'amqp://node2']
  const channel = await conn.createChannel();
  const queue = 'taskQueue';

  // Quorum Queue 提高可靠性
  await channel.assertQueue(queue, { durable: true, arguments: { 'x-queue-type': 'quorum' } });
  channel.prefetch(1);

  channel.consume(queue, async (msg) => {
    const task = JSON.parse(msg.content.toString());
    console.log(`Worker PID ${process.pid} processing task ${task.id}`);

    try {
      // 模拟任务处理
      await new Promise(resolve => setTimeout(resolve, 100));

      // ack 消息
      channel.ack(msg);
    } catch (err) {
      console.error(err);
      // 不 ack,消息自动重试或进入死信队列
    }
  }, { noAck: false });
}

startConsumer();

(3)使用 PM2 启动 Cluster 模式

arduino 复制代码
pm2 start consumer.js -i max

说明:

  • -i max 表示 PM2 根据 CPU 核心数自动启动 Worker。
  • 每个 Worker 都会独立连接 RabbitMQ 并消费队列。
  • RabbitMQ 会将消息公平分发给 Worker,不会重复或冲突。
  • delivery tag 在每个 Worker 内独立管理,安全可靠。

4. 多进程分发与汇总策略

  1. 主任务拆分

    • 将任务拆分为子任务 → 发送到队列。
  2. Worker 并行处理

    • PM2 启动多个 Worker,每个 Worker 独立消费队列消息。
  3. 结果汇总

    • Worker 处理完成后,将结果写入数据库或发送到汇总队列。
    • 使用幂等操作避免重复更新。

5. 注意事项

  1. 幂等性

    • 每条消息加唯一 ID,避免重复处理或更新全局状态。
  2. 顺序敏感任务

    • 需要单独队列处理,或在 Worker 内部使用子队列顺序消费。
  3. 资源监控

    • 监控队列长度、Worker 消费速率、CPU/内存使用。
  4. 消息确认机制

    • 成功处理后 ack,失败进入死信队列,保证可靠性。

6. 总结

  • PM2 Cluster 模式无需手动管理 cluster,自动利用多核 CPU。

  • RabbitMQ 消息位置(delivery tag)在每个 Worker 内独立管理,不会冲突。

  • 消息队列在集群模式下可靠性由 Quorum Queue 保证,多进程并行消费通过 PM2 Cluster 实现。

  • 核心原则:

    1. Worker 独立 channel。
    2. 幂等处理。
    3. 顺序敏感任务单独队列或内部顺序消费。
    4. 汇总结果可统一写入数据库或缓存。

本文部分内容借助 AI 辅助生成,并由作者整理审核。

相关推荐
一鹿高歌几秒前
🔥内存炸了!背刺我的竟然是Redisson!!
后端
lizhongxuan2 分钟前
AI 的底层思考
后端
阿星AI工作室4 分钟前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
Kayshen8 分钟前
我用纯前端逆向了 Figma 的二进制文件格式,实现了 .fig 文件的完整解析和导入
前端·agent·ai编程
wuhen_n11 分钟前
模板编译三阶段:parse-transform-generate
前端·javascript·vue.js
椰子皮啊11 分钟前
音视频会议 ASR 实战:概率性识别不准问题定位与解决
前端
小码哥_常12 分钟前
Kotlin扩展:为代码注入新活力
前端
小码哥_常13 分钟前
Kotlin函数进阶:解锁可变参数与局部函数的奇妙用法
前端
Wect14 分钟前
浏览器缓存机制
前端·面试·浏览器
滕青山15 分钟前
正则表达式测试 在线工具核心JS实现
前端·javascript·vue.js