master + worker模式的node多核解决框架——nodecluster

摘要:
主+工作模式节点多核解决方案框架——节点集群CNodemaster+工作模式多核解决框架——节点群仍然担心节点在单个进程中运行?但为什么不先尝试节点集群,然后再自己动手呢?https://github.com/aleafs/node-clusternode-cluster只有一个文件,只有500行代码,可以为您解决上述所有问题。这很容易理解。一旦建立了连接,后续请求与主机无关;在短连接模式下,节点簇被封装后,QPS的20%丢失。

master + worker模式的node多核解决框架——node-cluster - CNode

master + worker模式的node多核解决框架——node-cluster

还在为node运行于单进程而苦恼么?即便是node本身提供了cluster功能,或者在github和npm上有很多优秀的模块帮你做封装,但你仍然逃避不掉这些问题:

  1. 性能问题;
  2. 多进程worker的存活状态管理;
  3. 服务的平滑重启;
  4. 配置或者静态数据的动态reload.

我相信你完全有能力把这些事情做得很好。但在自己动手之前,为何不尝试一下node-cluster呢?
https://github.com/aleafs/node-cluster

node-cluster只有一个文件,区区500多行代码(包括注释),为你解决了上面的所有问题。利用node-cluster构建你的多进程服务非常简单:

  1. 在master进程中,你只需要5行代码:

    varcluster =require('node-cluster');
    varmaster =newcluster.Master();master.register(8080,'app.js');master.dispatch();
  2. 在worker进程中,你只需要关心你的app逻辑即可。一个基于HTTP协议的典型例子如下:

    varHttp=require('http');varcluster =require('node-cluster');
    varadmin  =newcluster.Worker();varserver  =Http.createServer(function(req,res){admin.transact();
      res.writeHead(200,{'Content-Type':'text/plain;charset=utf-8'});res.end('hello world');
      admin.release();});
    admin.ready(function(socket){server.emit('connection',socket);});

实际上,我设计node-cluster的初衷可不只是这点用途。糯米们都能发掘出哪些应用场景呢?

标签:


原创文章


pengchun 在 2012-2-1 21:13发布


pengchun 在 2012-2-2 10:22重新编辑


分享到 weibo

8 回复
master + worker模式的node多核解决框架——nodecluster第1张

#1
kongwu

期待性能数据!


kongwu 在 2012-2-2 00:42回复

master + worker模式的node多核解决框架——nodecluster第2张

#2
pengchun

在一台超线程可见 5 * Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 的虚拟机上用siege2.7本机压测,demo/main.js 下的33749端口,与node原生的http模块进行对比。由于基本不涉及IO操作,保证压测时工作进程CPU吃满,结果如下:

*connection: keep-alive模式下(长连接):siege -b -c2 -t1m *

  1. 原生HTTP,时长59.76s,QPS:8486.93,请求数507179,可用率100.00%;
  2. node-cluster,时长59.64s,QPS:8424.51,请求数502438,可用率100.00%;

*connection: close模式下(短连接):siege -b -c1000 *

  1. 原生HTTP,时长24.15s,QPS:4907.33,请求数118512,可用率99.93%;
  2. node-cluster,时长20.71s,QPS:3864.61,请求数80036,可用率100.00%;

结论如下:

  1. 长连接模式下HTTP协议无性能损失。这个容易理解,一旦连接建立,之后的请求就与master无关了;

  2. 短连接模式下,node-cluster封装之后有20%的QPS损失。在短连接模式下,操作系统的文件句柄数首先达到瓶颈。在测试之前,手工通过ulimit -n调整 max opend files为65535,并且在TIME_WAIT状态的TCP连接数小于100的情况下开始压测。

  3. 普遍而言,node的HTTP模块在短连接模式下,比长连接有接近50%的QPS损失。这一点要根据node的使用场景来判断用那种模式。在node做中间层服务时,我们建议采用keep-alive方式。


pengchun 在 2012-2-2 08:13回复

master + worker模式的node多核解决框架——nodecluster第2张

#3
pengchun

话说虚拟机真弱啊,在我的mac上,上边的测试,轻轻松松抛出两倍的QPS


pengchun 在 2012-2-2 09:13回复

{2}

master + worker模式的node多核解决框架——nodecluster第4张

suqian

mac上的文件句柄数设置搞掂了?


suqian 在 2012-2-2 10:00回复

master + worker模式的node多核解决框架——nodecluster第2张

pengchun

大概搞掂了,用的zsh,ulimit -n 就可以


pengchun 在 2012-2-2 10:23回复

master + worker模式的node多核解决框架——nodecluster第4张

#4
suqian

admin.transact()admin.release() 要使用者自行判断在那里调用?这样的使用体验不好啊。

应该让用户对这些没感觉才好,让他们使用起来就像普通的处理逻辑一样。


suqian 在 2012-2-2 10:13回复

{1}

master + worker模式的node多核解决框架——nodecluster第2张

pengchun

要是不想要平滑重启,能容忍少量的请求丢失,那么不要调这两个方法也可以


pengchun 在 2012-2-2 10:24回复

master + worker模式的node多核解决框架——nodecluster第4张

#5
suqian

@pengchun

functionlistenAt(obj,port){varserver  =newTCP();server.bind('0.0.0.0',port);server.listen('/dev/null');

server.listen('/dev/null'); 有具体含义吗?


suqian 在 2012-2-13 17:42回复

{1}

master + worker模式的node多核解决框架——nodecluster第2张

pengchun

没啥意义


pengchun 在 2012-2-15 10:17回复

master + worker模式的node多核解决框架——nodecluster第10张

#6
fish

@pengchun 同求解 :)


fish 在 2012-2-13 22:54回复

master + worker模式的node多核解决框架——nodecluster第11张

#7
snoopy

我想问下,多进程内存共享后台有自动同步吗?比如我想同步一些json数据,但是又不想借助如redis,mongodb等的第三方缓存。


snoopy 在 2012-2-14 10:23回复

{1}

master + worker模式的node多核解决框架——nodecluster第2张

pengchun

木有的,数据量大的话我还是建议用这些东西共享


pengchun 在 2012-2-15 10:18回复

master + worker模式的node多核解决框架——nodecluster第13张

#8
mackjoner

master.register(8080, 'app.js');
我想添加的是unix socket file,这个能做到吗,就是结合socket和node-cluster

免责声明:文章转载自《master + worker模式的node多核解决框架——nodecluster》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tomcat启动报错 ERROR o.a.catalina.session.StandardManager 182Zookeeper 安装和配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ElasticSearch性能优化策略【转】

ElasticSearch性能优化主要分为4个方面的优化。 一、服务器部署 二、服务器配置 三、数据结构优化 四、运行期优化 一、服务器部署 1、增加1-2台服务器,用于负载均衡节点 elasticSearch的配置文件中有2个参数:node.master和node.data。这两个参 数搭配使用时,能够帮助提供服务器性能。 1.1> node.ma...

CocoStudio基础教程(5)使用CocoStudio场景编辑器关联组件

1、概述   我们有了UI交互、有了动画人物、有了物理模拟,还差最后一步——将这些元素融合起来。这就要用到cocoStudio中的场景编辑器了。这次我们要将先前我们做过的所有东西都放到一个场景中去。这项工程比看起来是要简单。 2、创建场景   运行CocoStudio,选择SceneEditor。进入后创建一个新的工程:MyScene。然后找到先前我们制作...

6.深入k8s:守护进程DaemonSet

转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 最近也一直在加班,处理项目中的事情,发现问题越多越是感觉自己的能力不足,希望自己能多学点。我觉得人生的意义就是在于能够不断的寻求突破吧。 这篇文章会讲DaemonSet和Job与CronJob一起。在讲其中某一块内容的时候,我会将一些其他内容也...

前缀树及C++实现

文章   目录     1、什么是Trie树     2、树的构建与查询     3、Trie树的应用     4、C++实现Trie树以及解决一些字符串问题 前缀树 1 什么是Trie树   Trie树,即前缀树,又称单词查找树,字典树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系...

【小慕读书】—— 后台管理系统学习:后端框架搭建

前言:最近在学习Vue+Element UI+Node.js小慕读书中后台管理系统开发课程,这里对学习过程作个笔记,方便自己和大家翻阅。 一、Node 简介 Node 是一个基于 V8 引擎的 Javascript 运行环境,它使得 Javascript 可以运行在服务端,直接与操作系统进行交互,与文件控制、网络交互、进程控制等 与Chrome的区别:...

菜单树jstree.js插件几个主要事件汇总

jstree.js是一个很强大管理菜单的插件,奈何中文的文档或者案例太少了,用起来很痛苦,下面我就介绍这段时间我经常用到,平时项目也经常用到的几个知识点。 参考了一下文章: https://blog.csdn.net/j1137573560/article/details/82821839 https://www.cnblogs.com/chenjunsh...