PM2将Node.js的集群变得更加容易的实现方法

本文主要介绍了详解如何使用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 

当然,你可以指定任意数量的工作线程,线程的数量不仅限于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 参数用来告诉PM2以cluster_mode的形式运行你的app(对应的叫fork_mode),后面的数字表示要启动的工作线程的数量。如果给定的数字为0,PM2则会根据你CPU核心的数量来生成对应的工作线程。

PM2将Node.js的集群变得更加容易的实现方法

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

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

PM2将Node.js的集群变得更加容易的实现方法

实时扩展集群

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

PM2将Node.js的集群变得更加容易的实现方法

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

PM2的reload 功能将依次重启所有的工作线程。每一个线程会等待在新的线程创建之后才会被终止掉,因此,当你在产品环境部署新的代码时,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,这些产品的贡献者们一直在努力并使它们变得更好。

相关推荐:

关于Redis集群故障的分析

Redis集群搭建图文教程

redis集群搭建教程及遇到的问题处理

以上就是PM2将Node.js的集群变得更加容易的实现方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2790690.html

(0)
上一篇 2025年3月8日 19:00:13
下一篇 2025年3月8日 14:03:46

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vuejs实现本地数据的筛选分页功能

    做项目需要一份根据本地数据的筛选分页功能,下面小编把vuejs实现本地数据的筛选分页功能的实现思路分享到脚本之家平台,需要的朋友可以参考下,希望能帮助到大家。 效果图: 项目需要:点击左侧进行数据筛选,实现自动分页,自动生成页数,点击自动跳…

    2025年3月8日
    200
  • Js判断H5上下滑动方向详解

    本文主要为大家分享一篇js判断h5上下滑动方向及滑动到顶部和底部判断的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。 向上滑动隐藏底部悬浮框,向下滑动显示悬浮框。使用pc端浏览器查看请把浏览器设…

    编程技术 2025年3月8日
    200
  • IWinter一个路由转控制器的Nodejs库详解

    本文主要介绍了详解iwinter 一个路由转控制器的 nodejs 库,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 IWinter 是一个路由转控制器的 node 库,只解决一个问题:为了…

    编程技术 2025年3月8日
    200
  • js ajax同步请求造成浏览器假死的问题如何解决?

    本文主要为大家分享一篇解决js ajax同步请求造成浏览器假死的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,希望能帮助到大家。 一、问题的起因 今天做一个需求遇到了这么个情况,就是用户个人中心有个功能,点击按钮,可…

    编程技术 2025年3月8日
    200
  • nodejs最新版安装npm的使用方法分享

    本文主要介绍了nodejs 最新版安装npm 的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 # 安装 nodejs 以下介绍的是命令行安装方法,读者也可以到nodejs官网 上下…

    2025年3月8日
    200
  • javascript将url解析为json格式的两种方法

    本篇文章主要介绍了javascript将url解析为json格式的两种方法,具有一定的参考和学习javascript的价值,对javascript感兴趣的小伙伴们可以参考一下本篇文章 本文介绍了javascript将url解析为json格式…

    2025年3月8日
    200
  • JS模拟超市简易收银台小程序代码解析

    本文通过实例代码给大家介绍了js模拟超市简易收银台小程序代码,非常不错,具有参考和学习js的价值,对js感兴趣的的朋友参考下吧 废话不多说了,直接给大家贴代码了,具体代码如下所示:   // 1.编写一个程序,计算增加后的工资。要求基本工资…

    编程技术 2025年3月8日
    200
  • JavaScript 完成注册页面表单校验的实例

    下面小编就为大家带来一篇javascript 完成注册页面表单校验的实例。小编觉得挺不错的,现在就分享js源码给大家,也给大家做个参考。对javascript感兴趣的一起跟随小编过来看看吧 1、步骤分析 第一步:确定事件(onsubmit)…

    编程技术 2025年3月8日
    200
  • JavaScript文件的同步和异步加载的实现代码

    本篇文章主要介绍了javascript文件的同步和异步加载的实现代码,具有一定的参考和学习javascript的价值,对javascript感兴趣的可以了解一下本篇文章 对于JS文件的引用,尽管当前有不少框架和工具(比如webpack,co…

    2025年3月8日 编程技术
    200
  • JavaScript实现为事件句柄绑定监听函数实例详解

    本文主要介绍了javascript实现为事件句柄绑定监听函数的方法,结合实例形式分析了javascript事件绑定的常用技巧与注意事项,需要的朋友可以参考下,希望能帮助到大家。 在JavaScript中为Dom元素绑定事件监听函数是一件非常…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论