您的位置:

node.js中cluster,nodejs的使用

node.js中cluster,nodejs的使用

更新:

本文目录一览:

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重用到的.

node.js中cluster,nodejs的使用

本文目录一览: 1、nodejs cluster 主进程有什么用 2、Node.js真的有高并发优势吗 3、nodejs实现多进程(cluster 模式) 4、nodejs cluster.fork怎

2023-12-08
包含nodejs和cluster的词条

本文目录一览: 1、nodejs cluster 怎么用 2、为什么要用nodejs 3、NodeJs+Cluster和NodeJs+Nginx哪个好 nodejs cluster 怎么用 clust

2023-12-08
nodejs可以直接在linux运行吗,nodejs lin

2022-11-26
js单线程多核cpu(多线程多核)

本文目录一览: 1、使用node.js 的优势和劣势都有哪些 2、js进程和线程的区别 3、nodejs cluster 主进程有什么用 4、NodeJs多线程、多进程、定时任务 5、Node.js真

2023-12-08
linux运行node.js,Linux运行级别

本文目录一览: 1、如何在linux上如何安装使用nodejs 2、如何在linux上使用nodejs 3、如何让nodejs在linux后台运行 4、linux如何后台运行node服务? 如何在li

2023-12-08
node.js与java后端,nodejs能写后端吗

本文目录一览: 1、现大三学生学node.js后端和java后端哪个比较有优势 2、node.js是前端还是后端 3、用java做后台用nodejs做前台是什么意思 现大三学生学node.js后端和j

2023-12-08
python和nodejs,python和nodejs界面开

2022-11-23
python代替nodejs的简单介绍

本文目录一览: 1、nodejs和python哪个更好 2、nodejs 还是python? 3、Python和nodeJS哪个更适合做爬虫? 4、python和node.js哪个好,哪一个好学! 5

2023-12-08
nodejslinux后端运行,nodejs怎么运行前端项目

2023-01-04
nodejs和python哪个好,python+nodejs

2022-11-23
nodejs响应c+回调,nodejs调用C

2022-11-23
nodejs触发java程序(java nodejs)

2022-11-12
node.js后台源码,nodejs后端开发

本文目录一览: 1、nodejs模块源码能直接使用吗 2、什么是前端源码,什么是后台源码 3、如何在命令提示符里编译Node.js源代码的问题 nodejs模块源码能直接使用吗 可以。NodeJS 定

2023-12-08
nodejs与c++交互(nodejs和c的关系)

本文目录一览: 1、nodejs的C/C++ addons机制是怎么实现的 2、如何安装node.js windows 3、nodejs如何把c指针转成buffer 4、在nodejs的command

2023-12-08
nodejs启动python,nodejs启动项目web

本文目录一览: 1、nodejs怎么调用python命令行 2、Electron 框架中调用 Python 构建桌面应用 3、如何运行nodejs环境 4、为什么我又从 Node.js 回到 Pyth

2023-12-08
nodejs性能php,nodejs性能提升

本文目录一览: 1、php 和nodejs 的各自优势有哪些,如果无基础开始,要学那个好 2、nodejs php哪个好 3、php的性能要比node.js高很多吗? 4、node.js和php哪个简

2023-12-08
node.js实例教程(Nodejs开发实战)

本文目录一览: 1、node.js 基础操作 2、如何编写 Node.js 扩展 3、如何在 Windows 10 中搭建 Node.js 环境 4、node.js如何运行 5、如何利用Node.js

2023-12-08
Ubuntu下使用Node.js进行开发

2023-05-18
node和php的区别,php还是nodejs

2022-12-02
nodejs启动java,nodejs启动本地服务器

2022-11-25