node.js-v0.8API解读(4)- Cluster

在node-v0.7版本中就对cluster模块增加了不少功能,由于一直是unstable版本,所以也没仔细看,这次0.8版本将cluster放进了doc中,官网的0.8介绍页单独将cluster模块作为介绍一条了:

4、The cluster module is much more awesome.
我们来看下cluster现在健壮到什么程度了。

接下来,我们就对cluster模块做一些说明:
1、很遗憾,目前cluster模块还是处于Stability: 1 - Experimental 实验阶段,所以大家在使用这个模块的时候还是悠着点吧,不过至少我目前用在项目中的情况来看,还是比较稳定的,没有DOWN,我开了4个worker用来监听不同的端口,做在线聊天的服务器。

2、cluster.settings
是一个只读的对象,对象有3个key
exec String file path to worker file. (Default=filename)
//执行程序的路径,默认是
filename
args Array string arguments passed to worker. (Default=process.argv.slice(2))
//参数的数组,就是执行这个程序所带的参数
silent Boolean whether or not to send output to parent’s stdio. (Default=false)
//是否silent启动,如果是silent启动则不会再控制台输出消息

这个属性要设置的话,需要使用cluster.setupMaster([settings])来进行设置,这个settings就是上面这3个key的对象。

3、cluster.isMaster
返回一个布尔值,表示当前进程是否是Master主进程,同理cluster.isWorker

4、fork事件
当一个新的worker fork了,主进程就会受到一个fork的事件,官方给出了下面这些代码用来处理fork一个子进程超时的情况的:
var timeouts = [];
function errorMsg() {
console.error(“Something must be wrong with the connection …”);
}

cluster.on(‘fork’, function(worker) {
timeouts[worker.id] = setTimeout(errorMsg, 2000);
});
cluster.on(‘listening’, function(worker, address) {
clearTimeout(timeouts[worker.id]);
});
cluster.on(‘exit’, function(worker, code, signal) {
clearTimeout(timeouts[worker.id]);
errorMsg();
});
简单解释下以上代码,当我们批量fork了几个worker后,就会触发fork事件了,于是我们为每一个worker设定了一个timeout。
在此之前,我们还添加了listening和exit的事件监听,一旦触发了这些事件,都将把这个worker的定时器清零。

5、online 事件
当worker被fork后,会通知master,于是master就会触发online事件,当online事件触发,就说明子进程已经完全建立起来了。可以说是onready事件。
cluster.on(‘online’, function(worker) {
console.log(“Yay, the worker responded after it was forked”);
});

6、listening 事件
当worker有.listen()方法执行后,就会向Master告知,并触发listening事件,我们可以拿到woker的对象和监听的地址以及端口。
cluster.on(‘listening’, function(worker, address) {
console.log(“A worker is now connected to “ + address.address + “:” + address.port);
});

7、disconnect 事件
disconnect 事件是0.6版本以后添加的,当主进程执行disconnect()方法时,主进程就会触发disconnect事件

8、exit 事件
当worker退出触发此事件,

9、setup 事件
当主进程执行.setupMaster()方法时,就吹触发setup事件

10、cluster.setupMaster([settings])
见上面

11、cluster.fork([env])
这个产生一个新的worker,这个方法只能在master中执行,env是一个key/value对,用来添加到worker中,这个方法将返回一个worker的对象。
比如,我们这样fork子进程 cluster.fork({name:’snoopy’})
这样在worker进程中获取变量:process.env.name //snoopy

12、cluster.disconnect([callback])
执行这个方法将让所有的worker优雅的自杀,等素有worker都死了之后执行callback函数。

13、cluster.workers
返回一个对象,work的id为key的work对象为value的对象。

14、worker.id
work子进程的id

15、worker.process
返回一个ChildProcess 对象

16、worker.suicide
一个布尔值,表示worker是否自杀了,在worker.destroy()或者.disconnect()方法执行后设置为true

17、worker.send(message, [sendHandle])
在主进程将对指定的worker发送msg,在worker,则可以执行process.send(msg);

18、worker.destroy()
杀死指定的worker进程,官方代码判断是否真被杀死:
cluster.on(‘exit’, function(worker, code, signal) {
if (worker.suicide === true) {
console.log(‘Oh, it was just suicide\’ – no need to worry’).
}
});

// destroy worker
worker.destroy();

19、worker.disconnect()
优雅的杀死worker,此worker进程不会接受其他请求,会在处理完当前事情之后自杀,下面是一段代码,用来优雅自杀,并且超时时间2秒:

if (cluster.isMaster) {
var worker = cluser.fork();
var timeout;

worker.on(‘listening’, function(address) {
worker.disconnect();
timeout = setTimeout(function() {
worker.send(‘force kill’);
}, 2000);
});

worker.on(‘disconnect’, function() {
clearTimeout(timeout);
});

} else if (cluster.isWorker) {
var net = require(‘net’);
var server = net.createServer(function(socket) {
// connection never end
});

server.listen(8000);

server.on(‘close’, function() {
// cleanup
});

process.on(‘message’, function(msg) {
if (msg === ‘force kill’) {
server.destroy();
}
});
}

20、message 事件
当worker收到message执行

21、online\listening\disconnect
和上面的cluster的事件相同,只不过这里的监听是针对单个worker进程的

22、exit 事件
相关的worker进程死掉之后触发