`

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

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

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

实时扩展集群

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

分享到:
评论

相关推荐

    详解如何使用PM2将Node.js的集群变得更加容易

    总之,PM2提供了一个强大的框架,让Node.js应用的集群管理变得非常简单。利用PM2的cluster模式运行,你可以很容易地提升应用的性能,同时保持应用的稳定性和可靠性。通过使用PM2,开发者可以不必关心底层集群管理的...

    Node.js-收集最棒的node.js模块这些模块可扩展node.js应用程序的功能

    9. PM2:PM2是一个生产级的Node.js进程管理器,它可以保持应用始终运行,具有负载均衡、日志管理和自动重启等功能,确保应用的高可用性。 10. ESLint:ESLint是一个静态代码分析工具,用于发现潜在的代码错误和风格...

    pm2.tar.gz

    **PM2:Node.js 应用管理神器** PM2 是一个流行的、生产级的 Node.js 进程管理器,它提供了稳定性和效率,确保你的应用程序始终保持运行状态,并且在出现问题时...在内网环境下,离线安装包的使用让部署变得更加灵活。

    Node.js_Learning

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够使用 JavaScript 来进行服务器端编程。这个"Node.js_Learning"的学习资料可能包含了高玉婷作者对 Node.js 的深入理解和实践指导,虽然描述...

    nodejs-tutorial-beginner:本Node.js教程适用于初学者

    13. **性能优化**:随着应用规模的扩大,了解如何利用集群、内存管理和性能分析工具(如 Node.js 性能面板)来优化 Node.js 应用变得至关重要。 14. **部署与监控**:最后,学习如何将 Node.js 应用部署到云平台...

    nodejs 相关PDF书集

    - 非阻塞I/O:Node.js的核心特性之一就是其非阻塞I/O模型,基于事件驱动和回调函数,使得处理大量并发请求变得高效。 - 文件系统操作:Node.js提供了丰富的文件系统API,可以用来读取、写入、创建、删除文件和目录...

    fullstack-part-3:第3部分node.js的单独回购

    由于JavaScript在前端开发中的广泛使用,Node.js的出现使得全栈开发变得更加流畅。 ### 1. Node.js基础 Node.js的核心特性是异步、事件驱动的非阻塞I/O模型,这使得它在处理高并发请求时表现优秀。Node.js使用模块...

    PM2(流程管理器2):生产流程管理器-开源

    它不仅提供了方便的应用程序管理和部署工具,还内置了负载均衡功能,使得在生产环境中运行和维护Node.js应用变得更加稳定和高效。 ### 一、PM2的主要特性 1. **自动重启**:PM2能够确保你的应用程序在崩溃或意外...

    详解使用PM2管理nodejs进程

    开发者可以进一步扩展PM2的功能,例如通过pm2-web模块,它提供了一个基于Web的接口,使得监控和管理应用进程变得更加直观和方便。 总之,PM2是Node.js应用进程管理的最佳选择之一,它提供了丰富的工具和命令来帮助...

    后端光环2

    - PM2:Node.js应用的进程管理工具,支持负载均衡和自动重启。 - Node.js集群:利用多核CPU,通过Node.js的cluster模块提升服务性能。 8. 测试与持续集成: - Mocha/Chai:JavaScript测试框架,用于编写单元测试...

    real-chat-nodejs:与用户和房间的实时聊天-Socket.io,Node和Express

    在本文中,我们将深入探讨如何使用Node.js、Express和Socket.io构建一个实时聊天应用程序,正如标题"real-chat-nodejs:与用户和房间的实时聊天-Socket.io,Node和Express"所示。这个项目的核心技术栈是JavaScript,...

    重新节点

    这种特性使得在JavaScript中模拟“重新节点”变得相对简单,例如,可以使用`location.reload()`方法刷新页面,达到重置环境的效果。 接下来,我们转向Node.js,它是一个基于Chrome V8引擎的JavaScript运行环境,...

    waysfood-be:WaysFood后端准备部署

    Node.js利用V8引擎提供高性能的JavaScript运行环境,通过npm(Node Package Manager)管理依赖,使得构建、测试和部署后端服务变得更加便捷。 部署过程通常包括以下几个步骤: 1. **环境配置**:确保服务器上安装...

    sails-chat:使用 Sails JS 的聊天应用程序

    - **部署**: Sails.js 应用可以通过 PM2 等进程管理器在 Node.js 环境下部署,确保应用的稳定运行。 - **扩展性**: Sails.js 支持插件机制,可以添加额外的功能,如日志、邮件服务等。 总结,"sails-chat" 示例项目...

    expresswebserver

    为了提高 Express 应用的可扩展性和性能,可以使用 PM2 或其他进程管理工具部署应用,并利用 Node.js 的 cluster 模块创建多进程的集群。 10. 测试与调试 Express 应用可以通过 Mocha、Chai 等测试框架进行单元测试...

    社交媒体应用服务器

    2. **Express框架**: 在Node.js生态系统中,Express是最受欢迎的Web应用框架,它简化了服务器端路由、中间件和模板引擎的使用,使得快速构建功能丰富的社交媒体应用变得可能。 3. **RESTful API设计**: 社交媒体...

    scaleable-express-app:可以扩展到单个服务器之外的快速服务器的示例(学习学习并玩得开心吗?)

    在IT行业中,随着互联网服务需求的增长,能够处理高并发和大规模数据的应用程序变得越来越重要。Express作为Node.js最流行的Web框架,为构建此类应用程序提供了强大的基础。本项目"scaleable-express-app"就是针对...

    chatApp:带SailsJS的应用

    前端使用浏览器支持的JavaScript实现用户界面和交互逻辑,而后端使用Node.js(JavaScript运行环境)处理业务逻辑和数据操作。 4. **前端开发**:在ChatApp中,前端可能使用了HTML、CSS和JavaScript(可能包括库如...

Global site tag (gtag.js) - Google Analytics