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

相关推荐
Highcharts.js7 分钟前
缺失数据可视化图表开发实战|Highcharts创建人员出生统计面积图表示例
开发语言·前端·javascript·信息可视化·highcharts·图表开发
LaughingZhu7 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
怕浪猫7 小时前
Electron 开发实战(一):从零入门核心基础与环境搭建
前端·electron·ai编程
Mahir087 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
小鹏linux8 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
前端若水9 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger9 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)9 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态9 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态9 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态