本文目录一览:
- 1、nodejs cluster 主进程有什么用
- 2、Node.js真的有高并发优势吗
- 3、nodejs实现多进程(cluster 模式)
- 4、nodejs cluster.fork怎么关闭进程
- 5、nodejs cluster 怎么用
nodejs cluster 主进程有什么用
我们都知道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会非常高,系统也会变得不稳定起来。
后记
后续笔者还将就nodejs下的多进程开发进行学习研究,并将总结进行分享。
Node.js真的有高并发优势吗
是的,适合I/O密集型应用,其特点为:
1. 它是一个Javascript运行环境
2. 依赖于Chrome V8引擎进行代码解释
3. 事件驱动
4. 非阻塞I/O
5. 轻量、可伸缩,适于实时数据交互应用
6. 单进程,单线程
最大优势:可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可
缺点也是明显的:
1. 不适合CPU密集型应用;
2. 只支持单核CPU,不能充分利用CPU
3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
nodejs实现多进程(cluster 模式)
Nodejs的主进程是单线程的,但它有多线程处理方案(更准备来说是多进程方案),即主进程开启不同的子进程,主进程接收所有请求,然后将分发给其它不同的nodejs子进程处理。
它一般有两种实现:
Nodejs 的 cluster模式 用的就是第一种实现,它使用一个主线程 master 和多个子线程 worker ,形成一个集群,通过主线程来向子线程分发请求。cluster 实现了对 child_process 的封装,通过 fork 方法创建子进程的方式实现了多进程模型。
http 和 cluster 、 process 都是 nodejs 的内置模块,不需要额外安装
实现过程大概是这样的: cluster 模块应用 child_process 来创建子进程,子进程通过复写掉 cluster._getServer 方法,从而在 server.listen 来保证只有主进程监听端口,主子进程通过 IPC 进行通信,其次主进程根据平台或者协议不同,应用两种不同模块( round_robin_handle.js 和 shared_handle.js )进行请求分发给子进程处理。
PM2是后台进程管理器,是多进程方案的一个成熟应用,可以帮助管理和保持应用程序在线。
全局安装: npm install pm2@latest -g
它的使用也非常简单:
PM2对nodejs应用,可以根据系统自动实现负载均衡: pm2 start http-server.js -i max
我们肯定不想每次启动时,都要手动输入一堆指令,所以我们可以将这些配置统一使用配置文件来管理,注意js文件名必须是 xxx.config.js ,我这里用 ecosystem.config.js :
apps 数组中,可以放置多个对象,对应多个文件执行不同的配置
执行配置: pm2 start ecosystem.config.js --env dev
可以看到在启动后,桌面上生成了流水和错误日志:
nodejs cluster.fork怎么关闭进程
cluster实质上是独立的进程.进程是不能共享变量的.除非通过消息通讯.维护cluster共同的一个总连接数.但一个连接是不会被不同的cluster重用到的.
nodejs cluster 怎么用
cluster实质上是独立的进程.进程是不能共享变量的.除非通过消息通讯.维护cluster共同的一个总连接数.但一个连接是不会被不同的cluster重用到的.