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 相关文章推荐
深入理解JavaScript定时机制
Oct 29 Javascript
JS中完美兼容各大浏览器的scrolltop方法
Apr 17 Javascript
javascript事件冒泡实例分析
May 13 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
Ajax使用原生态JS验证用户名是否存在
May 26 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
利用require.js与angular搭建spa应用的方法实例
Jul 19 Javascript
js中getter和setter用法实例分析
Aug 14 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
Jul 09 Javascript
详解vue身份认证管理和租户管理
May 25 Vue.js
详解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
zf框架的数据库追踪器使用示例
2014/03/13 PHP
php自定义类fsocket模拟post或get请求的方法
2015/07/31 PHP
php生出随机字符串
2017/07/06 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
关于this和self的使用说明
2010/08/01 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python中join()方法介绍
2018/10/11 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
什么是接口(Interface)?
2013/02/01 面试题
生物化工工艺专业应届生求职信
2013/10/08 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
师范生见习报告范文
2014/11/03 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript