• node.js cluster模式启用方式


      众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎。不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心处理器的系统中并不能发挥其最大的性能。本文主要介绍了详解如何使用PM2将Node.js的集群变得更加容易,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

    1.  Node.js的cluster模块

      幸运的是,Node.js给我们提供了cluster模块,它可以生成多个工作线程来共享同一个TCP连接。

      它是如何运作的呢?

      首先,Cluster会创建一个master,然后根据你指定的数量复制出多个server app(也被称之为工作线程)。它通过IPC通道与工作线程之间进行通信,并使用内置的负载均衡来更好地处理线程之间的压力,该负载均衡使用了Round-robin算法(也被称之为循环算

      法)。

      当使用Round-robin调度策略时,master accepts()所有传入的连接请求,然后将相应的TCP请求处理发送给选中的工作线程(该方式仍然通过IPC来进行通信)。

      那如何来使用呢?

      下面是一个最基本的例子:

    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核心的数量,因为它只是作为一个运行在CPU上的子线程。

      正如你所看到的,要使其正常运行,你需要将你的代码封装到cluster的处理逻辑中,并添加一些额外的代码来指定当一个线程挂掉之后如何进行处理。

     

    2.  使用PM2的方式

      内置的cluster

      PM2内部包含了所有上述的处理逻辑,因此你不必对代码做任何修改。我们将上面的代码还原成最原始的形式:

    1

    2

    3

    4

    5

    6

    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核心的数量来生成对应的工作线程。

      

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

      如果任意一个工作线程挂掉了,不用担心,PM2会立即将其重启。当然,你也完全可以在任何时候手动重启这些线程:

     

      实时扩展集群

      任何时候,如果你需要增加工作线程的数量,可以通过pm2 scale <app name> <n>来对集群进行扩展。参数<n>指定工作线程的数量,被用来增加或减少集群数。你也可以通过pm2 scale app +3的方式来指定要增加多少工作线程。

      在产品环境实现零停机更新

      PM2的reload <app name>功能将依次重启所有的工作线程。每一个线程会等待在新的线程创建之后才会被终止掉,因此,当你在产品环境部署新的代码时,server会不间断地一直保持运行。

      使用gracefulReload功能可以达到相同的目的,不同的是它不会立即终止工作线程,而是通过IPC发送一个shutdown信号来关闭所有当前的连接并处理一些自定义的任务,然后再优雅地退出。如下面的代码:

    1

    2

    3

    4

    5

    6

    7

    8

    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会自动运行之前保存的应用。

    3.  通过配置pm2文件启动cluster模式(简单快捷)

      pm2启动文件:

      {

        "apps": [

          {
             "name": "mywork", //应用程序名称

             "cwd""srv/node-app/current",//应用程序所在的目录

            "script": "bin/www",//应用程序的脚本路径
         "exec_mode": "cluster",//应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
      
            

          }
         ]
      }
    更详细的pm2启动文件配置:http://www.cnblogs.com/lxg0/p/7771229.html#commentform

     

    结论

      Cluster模块的功能非常强大,使用PM2会使它变得更加容易。在Node 0.10.x时代cluster.js还只是个试验品,但从Node 0.11.x开始已经逐渐成熟并开始准备正式发布,当然也包括Node 0.12.x版本。强烈推荐使用最新版的Node.js和PM2,这些产品的贡献者们一直在努

      力并使它们变得更好。

    相关推荐:

    Redis集群搭建全记录

    有关集群部署的10篇文章推荐

    简单介绍mysql集群(图)

    以上就是使用PM2将Node.js的集群变得更加容易的方法的详细内容,更多请关注php中文网其它相关文章!

     

    本文原创发布php中文网 ,转载请注明出处,感谢您的尊重!

    原文网址:http://www.php.cn/js-tutorial-382831.html

  • 相关阅读:
    jquery的选择器
    css单行文本与多行溢出文本的省略号问题
    div仿textarea使高度自适应
    css3制作炫酷导航栏效果
    变态的iis10
    Session丢失——解决方案
    sqlserver安装遇到的问题——1
    Win SERVER 2008 许可证激活失败,系统重启问题
    sqlserver2008 数据库
    VS2010 不显示 最近使用的项目 解决办法
  • 原文地址:https://www.cnblogs.com/foreveronlymiss/p/10167799.html
Copyright © 2020-2023  润新知