cluster
集群
单个Nodejs实例运行在单个线程中,为充分利用多核系统,需要启用一组Node进程处理负载任务。
cluster允许建立一个主进程和若干个worker进程,由主进程监控和协调worker进程的运行。
worker之间采用进程通信交换消息,cluster模块内置一个负载均衡。
cluster集成两个方面:
- 集成了child_process.fork方法创建node子进程的方式;
- 继承了很多多核cpu创建子进程后,自动控制负载均衡的方式;
cluster模块可以创建共享服务器端口的子进程。
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 {
// 工作进程可以共享任何 TCP 连接。
// 在本例子中,共享的是 HTTP 服务器。
http.createServer((req, res) => {
res.writeHead(200);
res.end('你好世界\n');
}).listen(8000);
console.log(`工作进程 ${process.pid} 已启动`);
}
主进程 3596 正在运行
工作进程 4324 已启动
工作进程 4520 已启动
工作进程 6056 已启动
工作进程 5644 已启动
工作原理
cluster支持两种分发连接方法:
- 循环法,由主进程负责监听端口,接收新连接后再将连接循环发给工作进程,在分发中使用了一些内置技巧防止工作进程中任务过载;
- 主进程创建监听socket后发送给感兴趣的工作进程,由工作进程负责直接接收连接;
Worker类
Worker对象包含了关于工作进程的所有的公共的信息和方法。
主进程中,使用cluster.workers获取
工作进程中,使用cluster.worker获取
disconnect事件
断开连接
error事件
工作进程中,可以使用process.on(‘error’)