使用cluster 将自己的Node服务器扩展为多线程服务器_node.js

用nodejs的朋友都有了解,node是单线程的,也就是说跑在8核CPU上,只能使用一个核的算力。
单线程一直是node的一个诟病,但随着0.6版本中引入cluster之后,这个情况则得到了改变,开发人员可以依靠cluster很轻松的将自己的Node服务器扩展为多线程服务器了。

什么是Cluster

cluster是node提供的一个多线程库,用户可以使用它来创建多个线程,线程之间共享一个监听端口,当有外部请求这个端口时,cluster会将请求转发到随机线程里。因为每个node线程都会占用几十兆的内存,所以不能像php那样对每个请求创建一个线程,一般来说创建的线程数最多都不会超过cpu的核心数量。

复制代码 代码如下:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
} else {
  // Workers can share any TCP connection
  // In this case its a HTTP server
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
  }).listen(8000);
}

如以上代码所示,程序运行时cluster.isMaster会被设置为true,当调用cluster.fork()之后,程序会创建一个线程,并重新运行,这时cluster.isMaster就被设置为false了。我们就主要通过这个变量来判断当前线程是不是子线程的。

还可以注意到,每个子线程被创建之后,都会监听8000端口而不会引起冲突,这就是cluster共享端口的功能了。

线程之间的通信

当线程被创建之后,他们彼此之间是没有共享内存或者数据的。所有的数据交换只能通过worker.send和worker.on('message',handler)在主线程里处理,下面列举一个广播系统的实例。

复制代码 代码如下:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {

  var workers=[];
  //新建worker
  function newWorker(){
    var worker=cluster.fork();

    //监听信息,如果type为broadcast的话,则确定为广播
    worker.on('message', function(msg) {
      if(msg.type=='broadcast'){
        var event=msg.event;
        //向所有worker发送此条广播
        workers.forEach(function(worker){
          worker.send(event);
        })
      }
    });
    return worker;
  }

  for (var i = 0; i < numCPUs; i++) {
    workers.push(newWorker());
  }

    cluster.on('online',function(worker){
        console.log('worker %d is online',worker.id);
    })
} else {
  var worker=cluster.worker;

  //广播就是发送一个type为broadcast的信息,event就是广播内容
  worker.broadcast=function(event){
    worker.send({
      type:'broadcast',
      event:event
    });
  }

  //这里用worker.on貌似不能监听到返回的信息
  process.on('message',function(event){
    console.log('worker: '+worker.id+' recived event from '+event.workerId);
  })

  //发送广播
  worker.broadcast({
    message:'online',
    workerId:worker.id
  })
}

需要注意的问题

在上面也提到,线程之间是不能共享数据的,所有的数据交换只能通过线程之间的通信来交换。而且所交换的数据都是可序列化的,所以函数,文件描述符和HttpResponse之类的东西都不能传递。

如果使用cluster,则需要在程序设计的时候考虑到数据交换的问题,我自己的做法就是将类似session的这些数据都存放在redis里,每个线程都做好存取的工作,所有的数据都不放在node内存里。

最后一点,cluster目前还被Node官方标记为Experimental状态,api在将来也许会改变。

时间: 2024-12-04 20:28:46

使用cluster 将自己的Node服务器扩展为多线程服务器_node.js的相关文章

使用Node.js为其他程序编写扩展的基本方法_node.js

 准备开始 首先我们用下面的目录结构来创建一个节点通知(node-notify)文件夹.   复制代码 代码如下: . |-- build/                   # This is where our extension is built. |-- demo/ |   `-- demo.js              # This is a demo Node.js script to test our extension. |-- src/ |   `-- node_gtkno

零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门_node.js

本文改自非鱼的<[翻译]前端开发人员入门指南,从零开始搭建Node.js, Express, Jade, Mongodb服务器>,之所以把Jade换成Ejs,是因为我觉得ejs更符合WEB编程人员的习惯,更确切说应该是更符合PHP.ASP程序员的使用习惯.好了,废话不多说,直接开始教程. 第1部分 – 15分钟安装 如果你真的是从零开始学,那就花点时间先把环境搭建起来吧.这不难,我用的是Win8,所以这看上去跟那些用Mac和Ubuntu或者其它*nix系统的教程有点区别,不过大致是一样的. 第

浅析node连接数据库(express+mysql)_node.js

操作是在ubuntu系统的下环境,简单记录一下过程. 首先用apt-get安装数据库,键入命令 sudo apt-get install mysql-server , 一路回车,然后在一个界面设置一下数据库root的密码就好了 在数据库里面我们需要创建一些东西.键入 mysql -uroot -p××××× 来进入sql控制台. 1.先创建数据集 create database databasename : 2.use database databasename : 3.建表(这里创建一个很简单

FrontPage服务器扩展

frontpage|服务器|frontpage|服务器 FrontPage服务器扩展可以做以下工作: (1),保存和检索Web服务器的文件: (2),远程执行所有文件管理操作: (3),改名或移动文件时纠正超级连接: (4),检查服务器上的HTML页面,并且抽取出超级连接信息: (5),管理FrontPage安全模型: (6),执行WebBot组件. 1,安装FrontPage服务器扩展 如果不但编写网页,而且还想通过FrontPage或Visual InterDev管理整个网站,你需要在你的W

ORACLE性能诊断―学习statspack笔记(四)[扩展statspack收集服务器统计]

oracle|笔记|服务器|统计|性能 ORACLE性能诊断―学习statspack笔记(四)[扩展statspack收集服务器统计]   作者:刘颖博 时间:2004-3-22 mail:liuyingbo@126.com,请指正   转载请注明出处及作者   说明:由于STATSPACK并不能获取全面分析性能问题所需要的所有信息,所以需要扩展其收集服务器的统计信息.(本文环境REDHAT Linux7.2)   VMSTAT介绍 通过STATSPACK收集服务器信息,主要通过收集VMSTAT

windows server 2003 frontpage服务器扩展组件怎么卸载呀

问题描述 windows server 2003 frontpage服务器扩展组件怎么卸载呀 我想升级2003到2008但是不能升级,要卸载Frongtpage才可以升级,但是我在组件里面都取消它为什么还说有呢,要怎么卸载? 解决方案 Frontpage好像是微软做网页的软件吧!在卸载程序里面看看

两台服务器扩展为十二台服务器后,性能提高多少

问题描述 两台服务器扩展为十二台服务器后,性能提高多少 公司之前的服务器是两台,现在要扩充到12台, 每台的配置跟以前的一样,这样的话性能是提高六倍吗? 解决方案 这个不是直接的以机器的数量为倍数的,像这样提升性能,最好的方式是先做一轮profiling,做一个benchmark, 同时可以帮助找到性能瓶颈,同样,你就可以知道需要提升性能的点,以及当你增加了机器以后,再做一次profiling,这样就可以对比benchmark来得到性能提升比例 解决方案二: 这不好说.如果性能的瓶颈在cpu,那

Visual studio 2012打开远程站点报错说web站点未安装frontpage服务器扩展

问题描述 我的web服务器是2008r2的,IIS所有的功能都装了,就是看不到FrontPage服务器扩展选项 解决方案 本帖最后由 Adam_An 于 2012-12-07 19:58:06 编辑解决方案二:引用楼主Adam_An的回复: 本帖最后由Adam_An于2012-12-0719:58:06编辑我的web服务器是2008r2的,IIS所有的功能都装了,就是看不到FrontPage服务器扩展选项 InstallingtheFrontPageServerExtensionsonIIS7没

404错误-搭建好服务器之后,启动服务器

问题描述 搭建好服务器之后,启动服务器 搭建好服务器之后,启动服务器,出现: DEBUG response status: 404 :/home/tclxa/.virtualenvs/zamboni/lib/python2.6/site-packages/pyelasticsearch/client.py:252 cilent.py文件如下: # -*- coding: utf-8 -*- from future import absolute_import from datetime impo