如何用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
相关产品推荐
相关产品推荐

