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下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
JS应用之禁止抓屏、复制、打印
Feb 21 Javascript
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
Jul 06 Javascript
javascript concat数组累加 示例
Sep 03 Javascript
jquery实现每个数字上都带进度条的幻灯片
Feb 20 Javascript
js使用循环清空某个div中的input标签值
Sep 29 Javascript
node.js实现BigPipe详解
Dec 05 Javascript
node.js中的fs.exists方法使用说明
Dec 17 Javascript
浅谈angularjs module返回对象的坑(推荐)
Oct 21 Javascript
Angular开发实践之服务端渲染
Mar 29 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
Oct 28 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
jQuery 使用手册(六)
2009/09/23 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
python中的五种异常处理机制介绍
2014/09/02 Python
简单谈谈python中的语句和语法
2017/08/10 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
python对文件的操作方法汇总
2020/02/28 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
运动会铅球比赛加油稿
2014/09/26 职场文书
优秀班主任申报材料
2014/12/16 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书