MST

星途 面试题库

面试题:Node.js中Cluster模块多核支持原理相关

请简述Node.js中Cluster模块是如何实现多核支持的,并且说明它在创建子进程时主要使用了哪些方法?
17.1万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

Cluster模块实现多核支持原理

  1. Master-Worker模型:Node.js的Cluster模块采用Master-Worker模型。主进程(Master)负责管理多个子进程(Worker),主进程不直接处理具体的业务逻辑,而是将任务分发给子进程。
  2. 共享服务器端口:Cluster模块允许所有子进程共享同一个服务器端口。这是通过操作系统底层的机制实现的,使得所有子进程都能接收到发往该端口的网络请求。
  3. 负载均衡:主进程通过内置的负载均衡机制,将客户端请求均匀地分发给各个子进程。当一个新的连接到达时,主进程会决定将这个连接交给哪个子进程处理,从而充分利用多核CPU的性能。

创建子进程主要使用的方法

  1. cluster.fork():这是创建新子进程的主要方法。调用该方法时,主进程会创建一个新的Node.js子进程,这个子进程与主进程共享相同的环境变量和代码。子进程启动后,会执行与主进程相同的JavaScript代码,但可以通过cluster.isMastercluster.isWorker属性来区分自己是主进程还是子进程,并执行不同的逻辑。例如,主进程中可能会有如下代码:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主进程 ${process.pid} 正在运行`);
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作进程 ${worker.process.pid} 已退出`);
  });
} else {
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界\n');
  }).listen(8000);
  console.log(`工作进程 ${process.pid} 已启动`);
}
  1. cluster.isMaster:这是一个布尔值属性,用于在代码中判断当前进程是否为主进程。在主进程中,该属性为true,可以用来执行主进程相关的逻辑,如创建子进程、监听子进程事件等。
  2. cluster.isWorker:这也是一个布尔值属性,在子进程中该属性为true。子进程可以利用这个属性来执行自身特有的逻辑,如处理具体的业务请求等。