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

到此这篇关于Node.js进程管理之进程集群的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Node.js进程管理之Process模块详解

    在前面Node.js事件运行机制也有提到,Node.js应用在单个线程运行,但是现在大部分服务器都是多处理器,为了方便使用多个进程,Node.js提供了3个模块.Process模块提供了访问正在运行的进程.child_process模块可以创建子进程,并与他们通信.cluster模块提供了实现共享相同端口的集群服务能力,允许多个请求同时处理. 一.Process模块 Process模块是一个无须使用require()就可以从node.js应用程序进行访问的全局对象. 二.进程I/O管道 Proc

  • Node.js进程管理之子进程详解

    一.理论 之前看多进程这一章节时发现这块东西挺多,写Process模块的时候也有提到,今天下午午休醒来静下心来好好的看了一遍,发现也不是太难理解. Node.js是单线程的,对于现在普遍是多处理器的机器是一种浪费,怎么能利用起来呢?于是child_process模块出现了.child_process模块可以在其他进程上产生.派生,并执行工作. child_process模块提供了一个ChildProcess的新类,它可以作为从父进程访问子进程的表示形式.Process模块也是ChildProce

  • 详细分析Node.js 多进程

    我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能. 每个子进程总是带有三个流对象:child.stdin, child.stdout 和child.stderr.他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象. Node 提供了 child_process 模块来创建子进程,方法有: exec - child_process.exec 使用子进程执行命令,缓存子进程的输

  • Node.js的进程管理的深入理解

    众所周知Node基于V8,而在V8中JavaScript是单线程运行的,这里的单线程不是指Node启动的时候就只有一个线程,而是说运行JavaScript代码是在单线程上,Node还有其他线程,比如进行异步IO操作的IO线程.这种单线程模型带来的好处就是系统调度过程中不会频繁进行上下文切换,提升了单核CPU的利用率. 但是这种做法有个缺陷,就是我们无法利用服务器CPU多核的性能,一个Node进程只能利用一个CPU.而且单线程模式下一旦代码崩溃就是整个程序崩溃.通常解决方案就是使用Node的clu

  • 详解两个Node.js进程是如何通信

    目录 前言 不同电脑上的两个 Node.js 进程间通信 使用 TCP 套接字 使用 HTTP 协议 同一台电脑上两个 Node.js 进程间通信 使用内置 IPC 通道 使用自定义管道 总结 前言 两个 Node.js 进程之间如何进行通信呢?这里要分两种场景: 不同电脑上的两个 Node.js 进程间通信 同一台电脑上两个 Node.js 进程间通信 对于第一种场景,通常使用 TCP 或 HTTP 进行通信,而对于第二种场景,又分为两种子场景: Node.js 进程和自己创建的 Node.j

  • 利用node.js如何创建子进程详解

    前言 node本身为单进程,并使用驱动模式处理并发,为了解决单进程在多核cpu上的资源浪费,node提供了cluster和child_process模块来创建多个子进程. Node.js是单线程的,对于现在普遍是多处理器的机器是一种浪费,怎么能利用起来呢?于是child_process模块出现了.child_process模块可以在其他进程上产生.派生,并执行工作. child_process模块提供了一个ChildProcess的新类,它可以作为从父进程访问子进程的表示形式.Process模块

  • 深入理解Node.js中的进程管理

    前言 本文主要对 Node.js 中进程管理相关的东西做一个简单介绍,包括 process 对象.child_process 模块和cluster 模块,详细的 API 可以查看官方文档,下面来看看详细的介绍吧. Process 对象 process 是 Node.js 的一个全局对象,可以在任何地方直接使用而不需要 require 命令加载.process 对象提供了 当前 node 进程 的命令行参数.标准输入输出.运行环境和运行状态等信息. 常用属性 argv process.argv 属

  • Redis集群详解

    Redis集群详解 Redis有三种集群模式,分别是: * 主从模式 * Sentinel模式 * Cluster模式 三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)--Redis Redis官网:https://redis.io/ ,最新版本6.0.5 主从模式 主从模式介绍 主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave). 其中主从复制有如下特点: * 主数据库可以进行读写操作,当读写操作导致数据变化时会自

  • 使用Node.js实现ORM的一种思路详解(图文)

    ORM是O和R的映射.O代表面向对象,R代表关系型数据库.二者有相似之处同时也各有特色.就是因为这种即是又非的情况,才需要做映射的. 理想情况是,根据关系型数据库(含业务需求)的特点来设计数据库.同时根据面向对象(含业务需求)的特点来设计模型(实体类).然后再去考虑如何做映射.但是理想很骨jian感dan,现实太丰fu满za. 没见哪个ORM是这么做的,也没见哪位高手会这么做设计.那么实际情况是什么样子的呢?以.net的Entity Framework为例. DB frist,就是先设计好数据库

  • node.js中grunt和gulp的区别详解

    node.js中grunt和gulp的区别详解 自nodeJS登上前端舞台,自动化构建变得越来越流行.目前最流行的当属grunt和gulp,这两个光看名字挺像,功能也差不多,不过gulp能在grunt这位大哥如日中天的境况下开辟出自己的一片天地,有着她独到的优点. 易用 Gulp相比Grunt更简洁,而且遵循代码优于配置策略,维护Gulp更像是写代码. 高效 Gulp相比Grunt更有设计感,核心设计基于Unix流的概念,通过管道连接,不需要写中间文件. 高质量 Gulp的每个插件只完成一个功能

  • LINUX中NGINX反向代理下的TOMCAT集群(详解)

    Nginx具有反向代理(注意和正向代理的区别)和负载均衡等特点. 这次Nginx安装在 192.168.1.108 这台linux 机器上.安装Nginx 先要装openssl库,gcc,PCRE,zlib库等. Tomcat 安装在192.168.1.168 和 192.168.1.178 这两台机器上.客户端通过访问192.168.1.108 反向代理访问到 192.168.1.168 和 192.168.1.178 里Tomcat 部署的工程内容. 1.Linux 下安装Nginx (机器

  • windows系统下node.js环境配置与安装教程图文详解(详细版)

    国内目前关注最高,维护最好的一个关于nodejs的网站应该是http://www.cnodejs.org/ windows系统下简单nodejs环境配置. 第一步:下载安装文件 下载地址:官网https://nodejs.org/en/download/ 这里用的是 第二步:安装nodejs 下载完成之后,双击 node-v6.9.1-x64.msi,开始安装nodejs,默认是安装在C:\Program Files\nodejs下面 第三步:安装相关环境 打开C:\Program Files\

  • 对node.js中render和send的用法详解

    大多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染.如果不想使用views文件夹,想自己设置文件夹名字,那么app.set("views","aaaa"); 如果想写一个快速测试页,当然可以使用res.send().这个函数将根据内容,自动帮我们设置了Content-Type头部和200状态码.send()只能用一次,和end一样.和end不一样在哪里?能够自动设置MIME类型. 如果想使用不同的状态码,可以: res.stat

  • Node.js中Express框架的使用教程详解

    目录 Express简介 Express生成器 1. 什么是Express生成器 2. 安装Express生成器 创建Express项目 安装项目依赖 运行Express项目 Express目录结构说明 创建一个新路由模块 1. 创建ejs模块文件 2. 创建路由文件 3. 在app.js中引入路由 4. 运行项目 经过前面几天对Node.js的学习,基本的开发知识已经逐渐掌握,所谓工欲善其事必先利其器,今天进一步学习Node.js的开发框架Express.利用Express框架可以快速的进行W

  • Node.js中参数传递的两种方式详解

    目录 参数传递方式 GET方式 POST方式 动态网页 参数传递方式 在Node.js中,参数传递常见的共两种方式: GET方式:通过地址栏键=值的方式进行传递. POST方式:通过表单的方式传递请求数据. GET方式 GET方式通常是在请求地址中以[?参数1=值1&参数2=值2]的格式进行传递,在Node.js中可以通过获取url然后进行获取参数,如下所示: //1.引入http模块 var http = require('http'); //2.创建服务 var server = http.

  • Node.js进程管理之进程集群详解

    一.cluster模块 Node.js是单线程处理,对于高并发的请求怎么样能增加吞吐量呢?为了提高服务器的利用率,能不能多核的来处理呢?于是就有了cluster模块. cluster模块可以轻松实现运行在同一机器不同进程上的TCP或HTTP服务器集群.它们仍使用相同的底层套接字,从而在相同的IP地址和端口组合上处理请求. 下面是它的一些事件属性和方法. 事件: fork:当新的工作进程已经被派生时发出.callback函数接收worker对象作为唯一的参数.function(Worker) on

  • Node.js中HTTP模块与事件模块详解

    Node.js的http服务器 通过使用HTTP模块的低级API,Node.js允许我们创建服务器和客户端.刚开始学node的时候,我们都会遇到如下代码: 复制代码 代码如下: var http = require('http'); http.createServer(function (req,res) {     res.end('Hello World\n'); }).listen(3000,"127.0.0.1"); console.log("Server funni

随机推荐