`

node使用cluster模块

 
阅读更多

参照《nodejs开发指南》(node版本 v0.8.16)

创建一个服务器,实现一个简单功能:记录用户请求数(node app.js进入调试模式)

var http = require('http');

var tag = 0

//exports.tag = tag
//module.exports.listen = function(port){
exports.listen = function startServer(port){
	// create http server
	var server = http.createServer(function (req, res) {
		// content header
		res.writeHead(200, {'content-type': 'text/plain'});
		// write message and signal communication is complete
		tag ++
		res.end("Hello, Visitor " + tag + "! I'm server " + process.pid + "\n");

		if (process && process.send) {
			process.send({ cmd: 'notifyRequest' });
		}
	});

	if (!module.parent) {
		console.log('Server debugging on '+ port +'/');
		server.listen(port);
	} else {
		console.log('Server running on '+ port +'/');
		server.listen(port);
	}
}

if (!module.parent) {
	this.listen(8124)
}

 使用cluster模块,开启多个进程共享服务端口,充分利用多核优势(node cluster.js进入生产环境)

var cluster = require('cluster');
var os = require('os');
// 获取CPU 的数量,让node进程数和cpu数目一致,充分均摊负载。
var numCPUs = os.cpus().length;
var workers = {};
//console.log('numCPU = ' + numCPUs)
if (cluster.isMaster) {

	var g_tag = 0

	// 主进程分支
	cluster.on('death', function (worker) {
		// 当一个工作进程结束时,重启工作进程
		delete workers[worker.pid];
		worker = cluster.fork();
		workers[worker.pid] = worker;
	});
	// 初始开启与CPU 数量相同的工作进程
	numCPUs = 4// 如果进程数多余cpu数目,进程处理请求将不均衡
	for (var i = 0; i < numCPUs; i++) {
		var worker = cluster.fork();
		worker.on('message', function(msg) {
			if (msg.cmd && msg.cmd == 'notifyRequest') {
				g_tag++;
				console.log('Visitor Total : %d ', g_tag);
			}
		});
		workers[worker.pid] = worker;
	}
	cluster.on('exit', function(worker, code, signal) { //每一个worker出错或者被kill掉时重启一个新worker
		console.log(worker.process.pid + " is no more running")
		process.nextTick(function () { //避免cpu负载过高,定时重启
			var worker = cluster.fork();
			worker.on('message', function(msg) {
				if (msg.cmd && msg.cmd == 'notifyRequest') {
					g_tag++;
					console.log('Visitor Total : %d ', g_tag);
				}
			});
			workers[worker.pid] = worker;
		});
	});
} else {
	// 工作进程分支,启动服务器
	var app = require('./app');
	//console.log(app.tag)  //如果需要访问此变量需要将它export,不然是undefined
	app.listen(3000);
}
// 当主进程被终止时,关闭所有工作进程
process.on('SIGTERM', function () {
	for (var pid in workers) {
		process.kill(pid);
	}
	process.exit(0);
});

 运行如下:

[root@ ~]# node cluster.js 
Server running on 3000/
Server running on 3000/
Server running on 3000/
Server running on 3000/

[root@ ~]# ps -ef | grep node
root      7587  1334  0 06:28 pts/1    00:00:00 node cluster.js
root      7589  7587  0 06:28 pts/1    00:00:00 /usr/local/node/bin/node /root/cluster.js
root      7590  7587  0 06:28 pts/1    00:00:00 /usr/local/node/bin/node /root/cluster.js
root      7591  7587  0 06:28 pts/1    00:00:00 /usr/local/node/bin/node /root/cluster.js
root      7592  7587  0 06:28 pts/1    00:00:00 /usr/local/node/bin/node /root/cluster.js
root      7598  1343  0 06:29 pts/2    00:00:00 grep node

 其中app.js中tag是worker各个进程内存,无法共享,g_tag通过events同步数据

结合forever模块,可以使程序后台运行

最简单的办法:
$ nohup node app.js &
forever能做更多的事情,比如分别记录输出和错误日志,比如可以在js中作为api使用。
$ sudo npm install forever -g   #安装
$ forever start app.js          #启动
$ forever stop app.js           #关闭
$ forever start -l forever.log -o out.log -e err.log app.js   #输出日志和错误

注:如果要引用require('app'),则需要把app.js放到node_modules目录下

分享到:
评论

相关推荐

    详解通过源码解析Node.js中cluster模块的主要功能实现

    为了应对这个问题,Node.js内置了一个cluster模块,它允许我们以master-worker模式启动多个Node.js应用实例,从而充分利用多核CPU资源,并实现高可用性和负载均衡。 cluster模块的核心功能是创建一个master进程和多...

    Node.js中的cluster模块深入解读

    NodeJS引入了Cluster模块试图简化这些体力劳动,使用Cluster模块可以运行并管理多个实例进程,下面这篇文章主要给大家介绍了关于Node.js中cluster模块的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧

    node-cluster-example:在 Express 中使用 Node Cluster 模块的简单示例

    而 `Node Cluster` 模块是 Node.js 的一个核心模块,用于利用多核 CPU,提高服务性能。在这个“node-cluster-example”项目中,我们将看到如何在 Express 框架中集成并使用 Node Cluster。 Express 是一个轻量级、...

    深入剖析Node.js cluster模块

    借助node的cluster模块,开发者可以在几乎不修改原有项目代码的前提下,获得集群服务带来的好处。 集群有以下两种常见的实现方案,而node自带的cluster模块,采用了方案二。 方案一:多个node实例+多个端口 集群内的...

    Node学习记录之cluster模块

    以下是一个基本的`cluster`模块使用示例: ```javascript var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { for (var i = 0...

    浅谈node中的cluster集群

    Node.js 中的 Cluster 集群 ...Cluster 模块是 Node.js 中的一个重要模块,可以帮助我们提高应用的性能和可扩展性。但是,我们需要注意 Cluster 模块的使用限制和鉴权问题,以确保应用的安全和可靠性。

    node-no-crash:使用 cluster 模块防止服务器因未捕获的异常而崩溃的示例方法

    使用 cluster 模块防止服务器因未捕获的异常而崩溃的示例技术。 笔记 我发现 Express 会话不支持集群并且只能在单个实例上工作 :( 。 另一种技术是让服务器崩溃并使用“永远”或“永远监控”之类的东西自动重新启动...

    node-cluster-graceful-reload:例子

    使用 Node.js cluster 模块实现 graceful reload Node.js 由于是单线程的,为了更好的利用多核,官方提供了 cluster 模块。 cluster 模块可以让开发者很容易的创建子进程,这些子进程共享端口。 以下是官网的一段...

    11案例十: [压测 Cluster 的并发负载] Node 的集群 - cluster

    Node.js 的 `cluster` 模块默认使用轮询策略分配新连接,但可以通过自定义 `setupMaster` 函数来改变这种行为。例如,可以实现基于连接数的负载均衡,让连接数较少的工作进程接收更多连接。 ### 性能优化 - **监控...

    elasticsearch_node模块

    使用 `elasticsearch_node` 模块 在 `app.js` 文件中,首先需要引入 `elasticsearch` 模块: ```javascript const elasticsearch = require('elasticsearch'); ``` 接下来,你需要创建一个 Elasticsearch 的...

    NodeCluster:了解NodeJS集群模块

    了解NodeJS集群模块 统计数据显示,Node.js作为服务器端运行时环境正变得越来越流行,尤其是... 群集模块允许您创建子进程(工作程序),这些子进程与主Node进程(主程序)共享所有服务器端口。 在本文中,您将看到

    Node.js中多进程模块Cluster的介绍与使用

    在Node.js中使用Cluster模块的步骤大致如下: 1. 引入`cluster`模块: ```javascript var cluster = require('cluster'); ``` 2. 获取系统CPU核心数: ```javascript var numCPUs = require('os').cpus()....

    node-cluster-ex:node.js集群示例

    了解并掌握`cluster`模块的使用,能帮助开发者构建更高效、更健壮的Node.js应用,特别是在资源密集型或高并发场景下。 在实际项目中,可以根据需求调整集群的配置,比如设置更多的工作进程、优化通信机制、自定义...

    node中文api文档.pdf

    34. **worker_threads(工作线程)模块**:允许Node.js程序使用多线程。 35. **tty(终端)模块**:提供对终端的控制功能。 36. **url(URL)模块**:提供解析和操作URL的方法。 37. **util(实用工具)模块**:...

Global site tag (gtag.js) - Google Analytics