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 相关文章推荐
js中判断控件是否存在
Aug 25 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 Javascript
JS操作JSON要领详细总结
Aug 25 Javascript
jquery删除指定子元素代码实例
Jan 13 Javascript
JS实现浏览器状态栏显示时间的方法
Oct 27 Javascript
js获取隐藏元素的宽高
Feb 24 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 Javascript
Angular中响应式表单的三种更新值方法详析
Aug 22 Javascript
深入解析koa之异步回调处理
Jun 17 Javascript
微信小程序基础教程之worker线程的使用方法
Jul 15 Javascript
vue实现列表滚动的过渡动画
Jun 29 Javascript
微信小程序scroll-view不能左右滑动问题的解决方法
Jul 09 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 反射机制实现动态代理的代码
2008/10/22 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
javascript实现简易计算器
2017/02/01 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
python解析xml文件实例分享
2013/12/04 Python
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
实用的简历自我评价
2014/03/06 职场文书
安全生产承诺书范文
2014/05/22 职场文书
班子四风对照检查材料
2014/08/21 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
婚前协议书范本
2014/10/27 职场文书
学校2014年度工作总结
2014/12/06 职场文书
圆明园观后感
2015/06/03 职场文书
科技馆观后感
2015/06/08 职场文书
十八大观后感
2015/06/12 职场文书
运动会主持词大全
2015/07/02 职场文书
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers
instantclient客户端 连接oracle数据库
2022/04/26 Oracle