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

如何用Node.js的cluster模块搭建不同用途的双端口独立Worker进程?

使用Node.js Cluster模块实现多端口独立服务

没问题,用Node.js的cluster模块完全能实现你的需求!核心思路是让主进程管理两个独立的Worker实例——每个对应一个专属端口,并且当某个Worker崩溃时,只重启对应的那一个,不会牵连另一个端口的服务。下面是具体的实现方案和代码示例:

完整实现代码

const cluster = require('cluster');
const http = require('http');

// 定义需要运行服务的两个端口
const targetPorts = [3000, 3001];

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 启动成功`);

  // 为每个端口启动一个Worker进程
  targetPorts.forEach(port => {
    const worker = cluster.fork({ WORKER_PORT: port });
    // 给Worker实例绑定端口标记,方便后续识别
    worker.assignedPort = port;
    console.log(`Worker进程 ${worker.process.pid} 已启动,监听端口 ${port}`);
  });

  // 监听Worker退出事件,仅重启对应端口的Worker
  cluster.on('exit', (worker, exitCode, signal) => {
    console.log(`Worker进程 ${worker.process.pid} 已退出(端口 ${worker.assignedPort}),退出码:${exitCode}`);
    // 重启对应端口的Worker
    const newWorker = cluster.fork({ WORKER_PORT: worker.assignedPort });
    newWorker.assignedPort = worker.assignedPort;
    console.log(`已重启Worker进程 ${newWorker.process.pid},继续监听端口 ${worker.assignedPort}`);
  });
} else if (cluster.isWorker) {
  const currentPort = process.env.WORKER_PORT;

  // 启动当前Worker对应的HTTP服务
  const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(`服务正常运行 | Worker PID: ${process.pid} | 端口: ${currentPort}\n`);

    // 模拟错误场景:访问/error路径时触发Worker崩溃
    if (req.url === '/error') {
      throw new Error('模拟Worker进程崩溃');
    }
  });

  server.listen(currentPort, () => {
    console.log(`Worker ${process.pid} 已开始监听端口 ${currentPort}`);
  });

  // 可选:捕获未处理异常,确保异常能触发Worker退出(让主进程重启)
  process.on('uncaughtException', (err) => {
    console.error(`Worker ${process.pid} 发生未处理异常:${err.message}`);
    // 主动退出进程,触发主进程的重启逻辑
    process.exit(1);
  });
}

关键逻辑说明

  • 主进程的Worker管理:通过targetPorts数组定义两个端口,循环为每个端口fork独立的Worker,同时通过环境变量WORKER_PORT给每个Worker传递专属端口,还给Worker实例绑定assignedPort属性,方便后续退出时快速识别对应端口。
  • 独立重启机制:当某个Worker因错误退出时,主进程只会根据它的assignedPort重启对应端口的Worker,另一个端口的Worker完全不受影响,保证服务的隔离性。
  • Worker的独立服务:每个Worker根据环境变量拿到自己的端口,启动独立的HTTP服务器,彼此运行在不同的进程空间,资源和错误完全隔离。
  • 错误处理优化:在Worker中捕获uncaughtException,当发生致命错误时主动退出,触发主进程的重启逻辑,避免服务挂死。

测试时你可以访问http://localhost:3000/error让3000端口的Worker崩溃,此时3001端口的服务依然正常响应,主进程会自动重启3000端口的Worker,不会影响另一个服务的运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:28:07