Node.JS 内置集群还是 PM2 集群?

Posted

技术标签:

【中文标题】Node.JS 内置集群还是 PM2 集群?【英文标题】:Node.JS built in cluster or PM2 clustering? 【发布时间】:2016-03-03 02:09:26 【问题描述】:

哪个更好?

我已经用 worker 激活了 Nodejs 集群模式,但现在我发现 PM2 可以做同样的事情。 我正在使用 keymetrics 从我的网络服务器查看统计数据,我注意到当我在不使用 PM2 集群功能的情况下启动 NodeJS 节点(带有内置集群)时,Keymetrics 报告使用了 20/30MB 的 Ram。

如果我停用集群(在节点内)并打开 PM2 集群,keymetrics 会报告大约 300MB 的 Ram 使用量。

现在,哪种方法更好,为什么内置集群关键指标报告仅 30MB 的 ram 使用量?

【问题讨论】:

【参考方案1】:

这实际上取决于您的 Node 应用程序的工作方式。如果您的application is stateless 则很容易使用 pm2 集群模式,因为它在代码更改方面不需要太多努力(或无需努力)。但是如果您的应用程序使用本地数据、会话或使用套接字,那么建议使用 Node.js 内置集群模块并使用 pm2 正常启动您的应用程序。

我的 Node 应用程序正在使用套接字和 MQTT,因此我不能直接使用 pm2 集群模式 (pm2 start app.js -i max),因为同一节点应用程序将在每个 CPU 上运行,并且它正在与客户端创建多个套接字连接。所以我必须使用节点集群手动管理集群和工作人员,并且必须使用sticky-sessions 和socket.io-redis 之类的节点包来设置所有工作人员之间的正确通信流。然后简单地使用pm2 start app.js启动我的节点应用程序

以下是一些有用的链接。

PM2 Clustur mode PM2 Recommendation Note Node Cluster

【讨论】:

你不能使用 redis 之类的东西来存储你的套接字会话,然后只使用 pm2 吗? 根据 PM2 的开发人员的说法,“您的进程永远不是主进程,因此它无法运行主进程。”这意味着您只能在没有-i 的情况下 pm2 您的应用程序,然后您的应用程序负责管理集群。 github.com/Unitech/pm2/issues/2885 PM2 提供了环境变量,您可以使用这些变量来检查当前进程是主进程还是其中一个工作进程。所以,你绝对可以使用 PM2 集群模式,你只需要在你的代码中使用套接字的部分实现一个简单的if (isMain) 检查。【参考方案2】:

我使用 PM2。它更好的原因有很多。

    与使用核心集群不同,您的代码几乎不需要修改即可使用 PM2。集群逻辑并不适用于我们构建的每个应用。 它从命令行扩展。我可以简单地运行 pm2 scale my-app +1 在部署后实时添加另一个工作人员。 您应该已经在使用 PM2 来保持进程处于活动状态。所以集群是免费的。

我无法复制与您的300MB 号码接近的任何内容。事实上,我最近有一个泄漏的应用程序,我不得不在上面使用--max-memory-restart,即使在这种情况下,内存使用量通常也低于100MB。虽然如果 PM2 的集群使用更多内存,我一点也不感到惊讶,因为它为您提供了很多开箱即用的功能。

我的建议是不要过早优化。使用 PM2,直到您真正需要从系统中挤出每一滴内存/性能(绝对不是在您有大量流量之前)。到那时,您可以确定集群需要的最低限度,并且可以自己重新实现这些部分。

资源

集群演练:https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/ PM2教程:https://futurestud.io/tutorials/pm2-cluster-mode-and-zero-downtime-restarts

【讨论】:

以上是关于Node.JS 内置集群还是 PM2 集群?的主要内容,如果未能解决你的问题,请参考以下文章

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

Node.js 集群共享缓存

pm2操作总结

如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用

nodejs面试

让node.js一直运行,关掉终端还可访问网站