注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

ClusterPlus——node.js多任务子进程管理模块  

2011-12-26 16:36:13|  分类: node |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
上篇博客提到node.js做聊天服务器,为了扩展性和充分里用nginx反向代理,我们一个node.js进程监听一个端口,这样就是一个简单的多个子进程,做不同的任务的系统了。
官网API只有简单的cluster.fork(),用来复制多个进程,而没有针对此系统的解决方案,包括以前的multi-node 和 cluster也都是这样。自己动手丰衣足食,于是就写了一个可以启动多个子进程,并且监听不同端口的面向过程的代码。
最近项目上线,总觉得这块东西可以单独写个moudle出来,花了点时间,整理了下代码提出了一个ClusterPlus模块,可以做到单独一个子进程干单独的事情,这里例子比较简单就是监听不同的端口,当然也可以用来跑不同的业务,require不同的moudle.js模块,原理是相同的。

项目地址:(以后会不断完善)


目前有如下功能:
1、可以多开子进程,并且可以在建立子进程时监听不同的端口,或者require其他业务模块,做不同的业务;
2、当子进程意外死亡时,主进程会自动唤醒,并且还是监听之前的端口,或做require之前死掉的这个进程的业务模块;
3、加入reload.js模块,感谢 Cluster 模块作者:aheckmann 提供的reload.js模块,我在次基础上2次开发,使之适用于ClusterPlus,reload.js是当有指定目录或文件有改动时,自动重启子进程,当然这个重启是软重启,master还在。
4、可以通过实例化的ClusterPlus对象,在master进程中,ClusterPlus.workobj 数组,按顺序存放素有子进程的pid;
5、ClusterPlus.restart()方法,可以传入pid对单个子进程进行重启,如果不传入pid,则视为全部子进程重启。

一个简单的例子:
var http = require('http'),
     cluster_plus = require('./ClusterPlus'),
     server = http.createServer(function (req, res) {
            res.end('thank you');
      }).listen(3000),
     cp = cluster_plus();
这样就像cluster.fork()那样启动了cpu个数量的子进程。
一个启动多个监听端口的例子:
var http = require('http');
var cluster_plus = require('./ClusterPlus');
var server = http.createServer(function (req, res) {
res.end('thank you');
});
var port = [3000, 3001, 3002, 3003, 3004, 3005];
var cp = cluster_plus({
logger:true,
num: 6,
reload:true,
CreateCallback:function(err, data){
if(err) console.log(err);
else {
console.log(data)
server.listen(port[data.num])
}
},
DeadCallback:function(err, data){
if(err) console.log(err);
else {
console.log(data);
}
},
RestartCallback:function(err, data){
if(err) console.log(err);
else {
console.log(data);
}
}
})
上面这个例子是复杂的例子,目前全部的ClusterPlus功能,是启动6个子进程,序号分别是0-5,监听数组port中对应的端口。
最后上api:
API:
setting example:{
logger:Boolean || function(str){},//布尔值,用来表示是否打开日志,或者是function,用来记录日志的方法,参数是str输出字符串
num:Integer, //整数,启动几个子进程
CreateCallback:function(err, childobj){}, //函数,当创建完成后执行,返回的参数是num整形表示第几个child,和进程ID
DeadCallback:function(err, childobj){},//函数,当子进程死掉时执行,返回的参数是num整形表示第几个child,和进程ID
RestartCallback:function(err, childobj){},//函数,当子进程重启时执行,返回的参数是num整形表示第几个child,和进程ID
reload:Boolean,string //布尔值或字符串,当为true时默认系统目录,或者为字符串,可以是文件名,文件目录。
*childobj = {num:num, pid:pid}
}
或者直接传入 setting = Integer,表示启动多个node.js
或者不传参数,表示根据系统cpu数启动多个node.js
ClusterPlus = require('ClusterPlus')();
返回ClusterPlus实例,master中将有:
1、ClusterPlus.workobj 数组,按顺序存放素有子进程的pid
2、ClusterPlus.restart()方法,可以传入pid,如果不传入则视为全部子进程重启

重点说一句,如果要使用自己的日志记录,可以传入:logger:function(str){ _logger.error(str) },这样ClusterPlus记录的日志都存到了指定的日志文件中了,默认的ClusterPlus日志还有待完善。

目前的值得改进的地方:
1、当开启reload.js后,当有语法错误或者其他致命错误时,可能会导致子进程不断重启,日志文件爆掉或者瘫痪。准备在这里加入计时器,保护式重启,当有异常错误导致子进程连续奔溃时,过一阵子再重启。
2、对子进程的管理目前就2个,一个查看子进程ID和一个重启服务,比较薄弱,打算以后加入子进程监护,随时了解子进程的运行状态。
3、准备加入子进程动态加载,只有需要的时候才加入子进程,干完活或出错时自杀,当有需要的时候再将其唤醒。
4、完善默认的ClusterPlus日志。
5、可能用于生产中还需要不断完善bug

有兴趣的朋友可以qq:53822985或者留言,记得fork哦!
  评论这张
 
阅读(2290)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016