介绍
NodeJS的JavaScript运行在单个进程的单个线程上,一个JavaScript执行进程只能利用一个CPU核心,
而如今大多数CPU均为多核CPU,为了充分利用CPU资源,Node提供了child_process和cluster模块来实现多进程以及进程管理。
我们这里将根据Master-Worker模式,搭建一个简单的服务器集群来充分利用多核CPU资源,探索进程间通信、负载均衡等知识。
下图是Master-Worker模式,进程分为master进程和worker进程,master进程负责调度或管理worker进程,worker进程则负责具体的业务处理。
在服务器层面,worker可以是一个服务进程,负责处理来自客户端的请求,多个worker便相当于多个服务器,从而构成一个服务器集群。
master则是负责创建worker,将来自客户端的请求分配到各个服务器上去处理,并监控worker的运行状态以及进行管理等操作。
child_process
1.创建子进程
child_process模块提供了spawn()、exec()、execFile()、fork()这4个方法用于创建子进程,
我们这里使用fork()方法来创建子进程,fork()方法只需指定要执行的JavaScript文件模块,即可创建Node的子进程。
下面是简单的HelloWorld示例,master进程根据CPU数量创建出相应数量的worker进程,worker进程中利用进程ID来标记自己。
以下是master进程代码,文件名为master.js。
const childProcess = require('child_process')
const cpuNum = require('os').cpus().length
for (let i = 0; i < cpuNum; ++i) {
childProcess.fork('./worker.js')
}
console.log('Master: Hello world.')
以下是worker进程的代码,文件名为worker.js。
console.log('Worker-' + process.pid + ': Hello world.')
执行node master.js,得到如下结果,master创建4个worker后输出HelloWorld信息,每个worker也分别输出自己的HelloWorld信息。