Node.js进程管理之进程集群

一、cluster模块

Node.js是单线程处理,对于高并发的请求怎么样能增加吞吐量呢?为了提高服务器的利用率,能不能多核的来处理呢?于是就有了cluster模块。

cluster模块可以轻松实现运行在同一机器不同进程上的TCP或HTTP服务器集群。它们仍使用相同的底层套接字,从而在相同的IP地址和端口组合上处理请求。

下面是它的一些事件属性和方法。

事件:

fork:当新的工作进程已经被派生时发出。callback函数接收worker对象作为唯一的参数。function(Worker)

online:当新的进程发回一消息,表明它已经启动时发出。callback同上。

listening:当工作进程调用listen()开始监听端口时发出。callback:fucntion(Worker,address)

disconnect:当IPC通道被切断时发出。如服务器调用worker.disconnect()的时候。callback:function(Worker)

exit:在Worker对象已断开时发出。callback:function(Worker,code,signal)

setup:在setupMaster()被首次调用时发出。

属性和方法:

settings:包含exec(工作进程的javascript文件)、args(传递的参数数组)、silent(断开工作进程的IPC机制)属性值,用于建立集群

isMaster:判断当前进程是否是主进程

isWorker:判断当前进程是否是工作进程

setupMaster([settings]):启动主进程

disconnect([callback]):断开工作进程的IPC机制,并关闭句柄,当断开连接完成时回调

worker:引用在工作进程的当前Worker对象

workers:包含Worker对象,可以通过标识从主进程引用它们。cluster.workers[workerId]

二、Worker对象

当一个工作进程被派时,一个新的Worker对象同时在主进程和工作进程中创建。在工作进程中Worker对象用来表示当前的工作进程,并与正在发生的集群事件进行交互。在主进程中,Worker对象代表子工作进程,是主应用程序向他们发送信息,接收它们的状态变化的事件甚至杀掉他们。

它也是有一些事件属性方法。

事件:

message:在工作进程收到一个新信息时发出,回调函数把message作为唯一的参数值

disconnect:在IPC通道已对这个工作进程断开后发出

exit:Worker对象已经断开时发出

error:工作进程发生错误时发出

属性方法:

id:工作进程标识

Process:工作进程运行的ChildProcess对象

suicide:对这个工作进程调用kill()或disconnect()时被设置为true。可以使用此标志来确定是否要跳出尝试的循环,并退出

send(message,[sendHandle]):将消息发送到主进程

kill([signal]):通过断开IPC通道杀掉当前工作进程,然后退出,将suicide设置为true。

disconnect():工作进程调它时,关闭所有服务器,等待关闭事件,并断开IPC通道。当从主节点调时,发送一个内部消息给工作进程,使其断开本身,设置suicide为true。

三、实践

上面的也都是理论,下面通过实现一个HTTP集群来实践一下。

1.主进程

var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
  cluster.on('fork', function(worker) {
    console.log("Worker " + worker.id + " created");
  });
  cluster.on('listening', function(worker, address) {
    console.log("Worker " + worker.id +" is listening on " +
                address.address + ":" + address.port);
  });
  cluster.on('exit', function(worker, code, signal) {
    console.log("Worker " + worker.id +" Exited");
  });
  cluster.setupMaster({exec:'cluster_worker.js'});
  var numCPUs = require('os').cpus().length;
  for (var i = 0; i < numCPUs; i++) {
    if (i>=4) break;
    cluster.fork();
  }
  Object.keys(cluster.workers).forEach(function(id) {
    cluster.workers[id].on('message', function(message){
      console.log(message);
    });
  });
}

2.工作进程

var cluster = require('cluster');
var http = require('http');
if (cluster.isWorker) {
  http.Server(function(req, res) {
    res.writeHead(200);
    res.end("Process " + process.pid + " says hello");
    process.send("Process " + process.pid + " handled request");
  }).listen(8080, function(){
    console.log("Child Server Running on Process: " + process.pid);
  });
}

3.HTTP客户端测试

var http = require('http');
var options = { port: '8080'};
function sendRequest(){
  http.request(options, function(response){
    var serverData = '';
    response.on('data', function (chunk) {
      serverData += chunk;
    });
    response.on('end', function () {
      console.log(serverData);
    });
  }).end();
}
for (var i=0; i<5; i++){
  console.log("Sending Request");
  sendRequest();
}

首先是启动主进程,创建工作进程开始监听

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_server.js
Worker 1 created
Worker 2 created
Worker 3 created
Worker 4 created
Child Server Running on Process: 6152
Worker 1 is listening on null:8080
Child Server Running on Process: 10340
Worker 2 is listening on null:8080
Child Server Running on Process: 11412
Worker 3 is listening on null:8080
Child Server Running on Process: 12120
Worker 4 is listening on null:8080

其次启动HTTP客户端测试

"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_client.js
Sending Request
Sending Request
Sending Request
Sending Request
Sending Request
Process 12120 says hello
Process 11412 says hello
Process 12120 says hello
Process 10340 says hello
Process 6152 says hello

Process finished with exit code 0

下面容我文艺一下下附上最近很火也很喜欢一句话:生活不止眼前的苟且,还有诗和远方。

时间: 2024-10-24 15:54:44

Node.js进程管理之进程集群的相关文章

Node.js 包管理器 ied

ied 详细介绍 ied 是另一个 Node.js 包管理器,类似 npm,但是比 npm 快! 主要特性: 快速,完全并发安装 正确解决依赖 支持 semver 正确处理 devDependencies 生成一个平滑的 node_modules 目录 快速缓存 与 npm registry 交互 包没有全局命名空间 允许你在同一个包a require 多个版本 通过进程条可视化指示器进程 遵循你的全局配置 提供有用工具集,比如 ping, config, ls 支持私有 registries

如何管理一台集群的虚拟机

现如今的企业组织需要保证全年的每一天都24小时全天候的正常运营.而且,他们的服务必须保持时刻在线,否则就会失去客户.同时,在今天的全球市场上,确保企业的系统总是可用,以使得企业组织保持竞争优势,进而保持和提升用户满意度是至关重要的.数据中心的高度可用性可以通过几种方式来实现,但最常见的和最简单的方式则是通过服务器虚拟化和故障转移群集(Failover Cluster). 服务器虚拟化为许多企业组织的IT部门带来了诸多的益处,包括允许他们将多款不同的系统整合到一台单一的主机服务器,带来了更高的资源

Node.js包管理器Yarn的入门介绍与安装_node.js

前言 这两天大家有没有都被Yarn悄悄刷了屏,最近Facebook 发布了新的 node.js 包管理器 Yarn 用以替代 npm .为了跟上 Javascript 这股潮 流的脚步,大概的浅尝了一下这个自称是又快又可信赖又安全的包管理,所以写的内容不会很详细,更多的可能只是针对这个全新的包管理与 npm 的不同之处来对比.也可能有些地方写得不对,如果有的话,欢迎指正. 一.安装 首先当然是安装啦.跟 npm 这种被钦点而随 nodejs 一起被安装的包管理器不同, Yarn 需要自行手动安装

云计算或成管理微创业集群的重要手段

微创业模式比较完整的提出最早出现于2011年1月发起的一项"中国互联网微创业计划",该计划首次提出了比较完整的关于微创业的运营模式,并推出了所有项目与互联网.移动互联网等先进技术和营销手段相结合以实现成效最大化的"微创业"原则. 创业实际上就是创造就业的机会,通过就业来推动物质财富的流动.微创业就是改变小区域内物质财富的流动状态.对于一个合理的.具有一定组织结构的微创业集群来说,一个小的创业变化或许会产生蝴蝶效应,而云计算将是管理微创业集群的重要手段. 作为新兴产业

node.js应用后台守护进程管理器Forever安装和使用实例_node.js

我们不可能直接通过node命令来管理远程站点,这样无法保证网站的可持续运行.我们用Forever来解决这个问题,它可以将NodeJS应用以后台守护进程的方式运行,我们还可以将NodeJS应用设成随系统启动而自动运行. 首先,安装Forever: 复制代码 代码如下: npm install forever -gd 这样Forever就安装好了,我们可以直接运行Forever命令: 复制代码 代码如下: forever --helpforever start app.jsforever stop

Solr集群搭建,zookeeper集群搭建,Solr分片管理,Solr集群下的DataImport,分词配置。

1   什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使 用SolrCloud来满足这些需求. SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心. 它有几个特色功能: 1)集中式的配置信息 2)自动容

linux进程管理之进程创建

所谓进程就是程序执行时的一个实例. 它是现代操作系统中一个很重要的抽象,我们从进程的生命周期:创建,执行,消亡来分析一下Linux上的进程管理实现. 一:前言 进程管理结构; 在内核中,每一个进程对应一个task.就是以前所讲的PCB.它的结构如下(include/linux/sched.h): struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; at

Android系统中的进程管理:进程的创建

对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平台的应用程序开发者,也适合对于Android系统内部实现感兴趣的读者. 概述 Android系统以Linux内核为基础,所以对于进程的管理自然离不开Linux本身提供的机制.例如: 通过fork来创建进行 通过信号量来管理进程 通过proc文件系统来查询和调整进程状态等 对于Android来说,进程

管理节点 mysql集群-mysq集群维护问题,搭建集群需要注意的情况

问题描述 mysq集群维护问题,搭建集群需要注意的情况 管理节点作用,数据节点能不能直接插入数据:在其中一个节点当机的时候,如何使集群不受影响 解决方案 http://server.it168.com/a2009/1019/767/000000767215.shtml无非就是配置一个容错的群集 解决方案二: http://blog.csdn.net/wzy0623/article/details/6554274