Node.js中多进程模块Cluster的介绍与使用


Posted in Javascript onMay 27, 2017

前言

我们都知道nodejs最大的特点就是单进程、无阻塞运行,并且是异步事件驱动的。Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。既然Node.js采用单进程、单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的Nodejs如何利用多核CPU呢?创始人Ryan Dahl建议,运行多个Nodejs进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布,而NodeJS 0.6.x 以上的版本提供了一个cluster模块 ,允许创建“共享同一个socket”的一组进程,用来分担负载压力。

本篇文章就基于该cluster模块来讲述Node.js在多核CPU下的编程。

Cluster模块介绍

nodejs所提供的cluster模块目前尚处于试验阶段,在v0.10.7的官方文档上我们可以看到模块的发布信息如下:

Stability: 1 - Experimental

关于该模块的功能,源文档描述如此“A single instance of Node runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.” 其意就是:Node的示例以单进程的模式运行,有时为了充分利用多核系统的资源用户需要运行一组Node进程来分担负载。

Cluster用法介绍

首先贴出一段该模块示例应用代码,接下来进行详细分析,代码如下:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
 require('os').cpus().forEach(function(){
 cluster.fork();
 });
 cluster.on('exit', function(worker, code, signal) {
 console.log('worker ' + worker.process.pid + ' died');
 });
 cluster.on('listening', function(worker, address) { 
 console.log("A worker with #"+worker.id+" is now connected to " +
  address.address +
 ":" + address.port); 
 }); 
} else {
 http.createServer(function(req, res) {
 res.writeHead(200);
 res.end("hello world\n");
 console.log('Worker #' + cluster.worker.id + ' make a response');
 }).listen(8000);
}

这段代码很简单,主线程就是当前运行的js文件,主线程根据你本机系统的核数来创建子进程。所有进程共享一个监听端口8000,当有请求发起时,主线程会将该请求随机分配给某个子进程。console.log('Worker #' + cluster.worker.id + ' make a response');这句代码可以打印出是哪个进程处理该请求。

问题分析

我们前面提到有请求发起时,由系统来决定将该请求交给哪个进程进行处理。这种完全依赖于系统的负载均衡存在着一个重要缺陷:在windows,linux和Solaris上,只要某个子进程的accept queue为空(通常为最后创建的那个子进程),系统就会将多个connetion分配到同一个子进程上,这会造成进程间负载极为不均衡。特别是在使用长连接的时候,单位时间内的new coming connection并不高,子进程的accept queue往往均为空,就会导致connection会不停的分配给同一个进程。所以这种负载均衡完全依赖于accept queue的空闲程度,只有在使用短连接,而且并发非常高的情况下,才能达到负载均衡,但是这个时候系统的load会非常高,系统也会变得不稳定起来。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery实现marquee效果(文字或者图片的水平垂直滚动)
Jan 07 Javascript
jquery获取radio值实例
Oct 16 Javascript
Javascript基础教程之for循环
Jan 18 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
Apr 16 Javascript
jQuery实现带渐显效果的人物多级关系图代码
Oct 16 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
Nov 26 Javascript
深入理解选择框脚本[推荐]
Dec 13 Javascript
Bootstarp基本模版学习教程
Feb 01 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
关于HTML5的data-*自定义属性的总结
May 05 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
微信小程序 调用微信授权窗口相关问题解决
Jul 25 Javascript
详解webpack打包vue时提取css
May 26 #Javascript
jQuery插件imgAreaSelect基础讲解
May 26 #jQuery
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
May 26 #jQuery
Angular2 之 路由与导航详细介绍
May 26 #Javascript
Agularjs妙用双向数据绑定实现手风琴效果
May 26 #Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
May 26 #Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
May 26 #Javascript
You might like
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
JQuery toggle使用分析
2009/11/16 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
script标签属性用type还是language
2015/01/21 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
详解Anaconda 的安装教程
2020/09/23 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
幼儿园户外活动总结
2014/07/04 职场文书
报名委托书
2015/01/29 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
详解Vue slot插槽
2021/11/20 Vue.js
APP界面设计技巧和注意事项
2022/04/29 杂记
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript