pm2-开启nodejs集群

介绍

你也许知道,Node.js是一个运行在名叫V8的JavaScript引擎的平台系统。V8本身是单线程运行的,并没有充分利用多核系统能力。 (注:Node执行JS代码运行在V8上,是单线程,但并非真正的单线程架构)

Node.js的集群模式

幸运的是,Node.js提供了集群模块,简单讲就是复制一些可以共享TCP连接的工作线程。 工作原理 集群模块会创建一个master主线程,然后复制任意多份程序并启动,这叫做工作线程。 工作线程通过 IPC 频道进行通信并且使用了 Round-robin algorithm 算法进行工作调度以此实现负载均衡。 Round-robin调度策略主要是master主线程负责接收所有的连接并派发给下面的各个工作线程。 如何使用 下面是一个很常见的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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核心限制的创建任意多个工作线程。 使用原生方法有些麻烦而且你还需要处理如果某个工作线程挂掉了等额外的逻辑。 (注:通过fork()复制的进程都是独立的进程,有着全新的V8实例) PM2的方式 PM2内置了处理上述的逻辑,你不用再写这么多繁琐的代码了。 只需这样一行:

1
$ pm2 start app.js -i 4` `-i <number of workers>

表示实例程序的个数。就是工作线程。 如果i为0表示,会根据当前CPU核心数创建

保持你的程序不中断运行

如果有任何工作线程意外挂掉了,PM2会立即重启他们,当前你可以在任何时候重启,只需: pm2 restart all

实时调整集群数量

你可以使用命令 pm2 scale <app name> <n> 调整你的线程数量, 如 pm2 scale app +3 会在当前基础上加3个工作线程。

在生产环境让你的程序永不中断

PM2 reload <app name> 命令会一个接一个的重启工作线程,在新的工作线程启动后才结束老的工作线程。 这种方式可以保持你的Node程序始终是运行状态。即使在生产环境下部署了新的代码补丁。 也可以使用gracefulReload命令达到同样的目的,它不会立即结束工作线程,而是通过IPC向它发送关闭信号,这样它就可以关闭正在进行的连接,还可以在退出之前执行一些自定义任务。这种方式更优雅。

结论

Cluster集群模式非常强悍有用,此功能是在Node 0.10.x 是实验功能,在0.11.x 之后才作为正式发布。

  • 版权声明: 本博客所有文章,未经许可,任何单位及个人不得做营利性使用!转载请标明出处!如有侵权请联系作者。
  • Copyrights © 2015-2020 翟天野

请我喝杯咖啡吧~