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 辅助生成,并由作者整理审核。

相关推荐
凌览10 分钟前
一键去水印|5 款免费小红书解析工具推荐
前端·javascript·后端
枫叶梨花11 分钟前
一次 Kettle 中文乱码写入失败的完整排查实录
数据库·后端
expect7g12 分钟前
Paimon源码解读 -- PartialUpdateMerge
大数据·后端·flink
lichong95114 分钟前
鸿蒙 web组件开发
前端·typescript
1024小神15 分钟前
在html中使用js动态交换两个元素的位置
前端
鹿鹿鹿鹿isNotDefined16 分钟前
逐步手写,实现符合 Promise A+ 规范的 Promise
前端·javascript·算法
一千柯橘16 分钟前
Electron - IPC 解决主进程和渲染进程之间的通信
前端
申阳17 分钟前
Day 16:02. 基于 Tauri 2.0 开发后台管理系统-项目初始化配置
前端·后端·程序员
bcbnb17 分钟前
游戏上架 App Store 的完整发行流程,从构建、合规到审核的多角色协同指南
后端
JavaGuide18 分钟前
美团2026届后端一二面(附详细参考答案)
java·后端