Cluster模块实现多核支持原理
- Master-Worker模型:Node.js的Cluster模块采用Master-Worker模型。主进程(Master)负责管理多个子进程(Worker),主进程不直接处理具体的业务逻辑,而是将任务分发给子进程。
- 共享服务器端口:Cluster模块允许所有子进程共享同一个服务器端口。这是通过操作系统底层的机制实现的,使得所有子进程都能接收到发往该端口的网络请求。
- 负载均衡:主进程通过内置的负载均衡机制,将客户端请求均匀地分发给各个子进程。当一个新的连接到达时,主进程会决定将这个连接交给哪个子进程处理,从而充分利用多核CPU的性能。
创建子进程主要使用的方法
- cluster.fork():这是创建新子进程的主要方法。调用该方法时,主进程会创建一个新的Node.js子进程,这个子进程与主进程共享相同的环境变量和代码。子进程启动后,会执行与主进程相同的JavaScript代码,但可以通过
cluster.isMaster
和cluster.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} 已启动`);
}
- cluster.isMaster:这是一个布尔值属性,用于在代码中判断当前进程是否为主进程。在主进程中,该属性为
true
,可以用来执行主进程相关的逻辑,如创建子进程、监听子进程事件等。
- cluster.isWorker:这也是一个布尔值属性,在子进程中该属性为
true
。子进程可以利用这个属性来执行自身特有的逻辑,如处理具体的业务请求等。