参照《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模块,它允许我们以master-worker模式启动多个Node.js应用实例,从而充分利用多核CPU资源,并实现高可用性和负载均衡。 cluster模块的核心功能是创建一个master进程和多...
NodeJS引入了Cluster模块试图简化这些体力劳动,使用Cluster模块可以运行并管理多个实例进程,下面这篇文章主要给大家介绍了关于Node.js中cluster模块的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
而 `Node Cluster` 模块是 Node.js 的一个核心模块,用于利用多核 CPU,提高服务性能。在这个“node-cluster-example”项目中,我们将看到如何在 Express 框架中集成并使用 Node Cluster。 Express 是一个轻量级、...
借助node的cluster模块,开发者可以在几乎不修改原有项目代码的前提下,获得集群服务带来的好处。 集群有以下两种常见的实现方案,而node自带的cluster模块,采用了方案二。 方案一:多个node实例+多个端口 集群内的...
以下是一个基本的`cluster`模块使用示例: ```javascript var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { for (var i = 0...
Node.js 中的 Cluster 集群 ...Cluster 模块是 Node.js 中的一个重要模块,可以帮助我们提高应用的性能和可扩展性。但是,我们需要注意 Cluster 模块的使用限制和鉴权问题,以确保应用的安全和可靠性。
使用 cluster 模块防止服务器因未捕获的异常而崩溃的示例技术。 笔记 我发现 Express 会话不支持集群并且只能在单个实例上工作 :( 。 另一种技术是让服务器崩溃并使用“永远”或“永远监控”之类的东西自动重新启动...
使用 Node.js cluster 模块实现 graceful reload Node.js 由于是单线程的,为了更好的利用多核,官方提供了 cluster 模块。 cluster 模块可以让开发者很容易的创建子进程,这些子进程共享端口。 以下是官网的一段...
Node.js 的 `cluster` 模块默认使用轮询策略分配新连接,但可以通过自定义 `setupMaster` 函数来改变这种行为。例如,可以实现基于连接数的负载均衡,让连接数较少的工作进程接收更多连接。 ### 性能优化 - **监控...
使用 `elasticsearch_node` 模块 在 `app.js` 文件中,首先需要引入 `elasticsearch` 模块: ```javascript const elasticsearch = require('elasticsearch'); ``` 接下来,你需要创建一个 Elasticsearch 的...
了解NodeJS集群模块 统计数据显示,Node.js作为服务器端运行时环境正变得越来越流行,尤其是... 群集模块允许您创建子进程(工作程序),这些子进程与主Node进程(主程序)共享所有服务器端口。 在本文中,您将看到
在Node.js中使用Cluster模块的步骤大致如下: 1. 引入`cluster`模块: ```javascript var cluster = require('cluster'); ``` 2. 获取系统CPU核心数: ```javascript var numCPUs = require('os').cpus()....
了解并掌握`cluster`模块的使用,能帮助开发者构建更高效、更健壮的Node.js应用,特别是在资源密集型或高并发场景下。 在实际项目中,可以根据需求调整集群的配置,比如设置更多的工作进程、优化通信机制、自定义...
34. **worker_threads(工作线程)模块**:允许Node.js程序使用多线程。 35. **tty(终端)模块**:提供对终端的控制功能。 36. **url(URL)模块**:提供解析和操作URL的方法。 37. **util(实用工具)模块**:...