下PM2将Node.js的集群转移得更其便于

介绍

  众所周知,Node.js运行于Chrome的JavaScript运行时平台及,我们拿该平台优雅地称呼V8引擎。不论是V8引擎,还是后来的Node.js,都是以单线程的方运行的,因此,在多中心处理器的网受并无可知表达其尽充分之属性。

Node.js的cluster模块

  幸运的是,Node.js给我们提供了cluster模块,它好转变多独干活线程来一起享同一个TCP连接。

  它是何等运作的吧?

  首先,Cluster会创建一个master,然后根据你指定的数复制出多独server
app(也让喻为工作线程)。它通过IPC大路及办事线程之间进行通信,并运用内置的负荷均衡来重新好地拍卖线程之间的下压力,该负载均衡使用了Round-robin算法(也为誉为循环算法)。

  当用Round-robin调度策略时,master
accepts()备传入的连续要,然后将相应的TCP请求处理发送给选中的干活线程(该方法还通过IPC来进展通信)。

  那哪来利用啊?

  下面是一个太基本的事例:

var cluster = require('cluster');  
var http    = require('http');  
var os      = require('os');

var numCPUs = os.cpus().length;

if (cluster.isMaster) {  
  // Master:
  // Let's fork as many workers as you have CPU cores

  for (var i = 0; i < numCPUs; ++i) {
    cluster.fork();
  }
} else {
  // Worker:
  // Let's spawn a HTTP server
  // (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");
  }).listen(8080);
}

  当然,你可指定任意数量之办事线程,线程的数量不仅限于CPU核心之数目,因为其独自是作一个周转于CPU上的子线程。

  正使您所盼的,要如该健康运行,你需要拿公的代码封装到cluster的拍卖逻辑中,并累加一些附加的代码来指定当一个线程挂掉后怎样进展拍卖。

使用PM2的方式

内置的cluster

  PM2内部含有了装有上述的处理逻辑,因此你不用对代码做另外改动。我们拿地方的代码还原成极原始的款型:

var http = require('http');

http.createServer(function(req, res) {  
  res.writeHead(200);
  res.end("hello world");
}).listen(8080);

  然后当控制台执行:

$ pm2 start app.js -i 4

  -i <number of
workers>参数用来报PM2以cluster_mode的款型运行而的app(对应的叫fork_mode),后面的数字代表如开动的行事线程的数码。如果给定的数字为0,PM2则会基于你CPU核心的多寡来变化对应之做事线程。

图片 1

不论什么情况下,保持你的apps一直运转

  如果任意一个工作线程挂掉了,不用顾虑,PM2会立即以该再开。当然,你为统统可于其它时刻手动重开这些线程:

图片 2

实时扩展集群

  任何时候,如果您要充实工作线程的数,可以经pm2 scale <app name>
<n>来对集群开展扩张。参数<n>指定工作线程的多少,被用来增加或者回落集群数。你呢足以由此pm2 scale app
+3的方法来指定要追加多少办事线程。

图片 3

当活环境实现零停机更新

  PM2的reload <app
name>功能以逐一重启所有的干活线程。每一个线程会等待在新的线程创建之后才见面吃停掉,因此,当您于成品环境布置新的代码时,server会不中断地直接保持运行。

  使用gracefulReload功能可达成平之目的,不同的凡她不会见及时停止工作线程,而是经过IPC发送一个shutdown信号来关闭所有当前之连续并拍卖部分于定义之任务,然后再优雅地退出。如下面的代码:

process.on('message', function(msg) {  
  if (msg === 'shutdown') {
    close_all_connections();
    delete_cache();
    server.close();
    process.exit(0);
  }
});

拿PM2配置成自动启动

  想使PM2在服务器再开后活动运行前的施用,可以预先通过pm2
start启动你的行使,然后实施下的一声令下:

pm2 save

  这将在~/.pm2目录下生成一个dump.pm2文件,里面描述了当下PM2达标运行在的装有以。然后执行命令:

pm2 startup [platform]

  注意有必要添加可选参数platform以鲜明告诉pm2当前的体系环境。这样,下次当服务器又开时,PM2会自动运行前封存之运。

结论

  Cluster模块的职能特别强,使用PM2碰头要它们换得越来越便于。在Node
0.10.x时cluster.js还特是独试验品,但自Node
0.11.x开头曾日趋成熟并开始准备正式披露,当然也包罗Node
0.12.x本。强烈推荐使用新型版本的Node.js和PM2,这些制品的贡献者们直于不遗余力并而其变得还好。

  尽情分享PM2带被Node.js集群操作的有益吧!

原文地址:https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/

再多关于PM2的装置与运好查此的文档:http://pm2.keymetrics.io/docs/usage/quick-start/