Node.js PM2中的群集和分叉模式差异

Node.js PM2中的群集和分叉模式差异,node.js,pm2,Node.js,Pm2,为了弄明白这个问题,我找了很多,但没有得到清楚的解释。集群应用程序可以扩展和分叉应用程序不能扩展只有一点不同吗 PM2的公共站点解释了集群模式可以做什么,但没有人说Fork模式的优点(也许,它可以得到NODE\u APP\u INSTANCEvariable) 我觉得集群可能是Fork的一部分,因为Fork似乎通常被使用。所以,从PM2的角度来看,我猜Fork的意思是“分叉过程”,而Cluster的意思是“分叉过程,可以扩展”。那么,我为什么要使用Fork模式呢?这里的文档和源代码确实有误导性

为了弄明白这个问题,我找了很多,但没有得到清楚的解释。集群应用程序可以扩展和分叉应用程序不能扩展只有一点不同吗

PM2的公共站点解释了集群模式可以做什么,但没有人说Fork模式的优点(也许,它可以得到
NODE\u APP\u INSTANCE
variable)


我觉得集群可能是Fork的一部分,因为Fork似乎通常被使用。所以,从PM2的角度来看,我猜Fork的意思是“分叉过程”,而Cluster的意思是“分叉过程,可以扩展”。那么,我为什么要使用Fork模式呢?

这里的文档和源代码确实有误导性

从源代码中了解到这一点,唯一的区别似乎是,它们使用节点
集群
子进程
API。因为
cluster
使用后者,所以实际上您也在这样做。在
fork\u模式中,有更多的自定义
stdio
传递。此外,
集群
只能通过字符串而不是对象进行通信

默认情况下,您使用的是
fork\u模式
。如果您通过
-i[number]
-选项,您将进入
cluster\u模式
,通常针对的是w/
pm2


另外,由于
EADDRINUSE
,实例可能无法在同一端口上侦听<代码>群集模式
can。通过这种方式,您还可以构建应用程序,使其在自动负载平衡的同一端口上运行。您必须构建没有状态的应用程序,例如会话、数据库。

Node.js是单线程的

这意味着您的英特尔四核CPU中只有1核可以执行节点应用程序

它叫:
fork\u模式

我们将其用于本地开发

pm2 start server.js-i 0帮助您在CPU的每个核心上运行1个节点线程

自动负载平衡无状态的传入请求

在同一端口上

我们称之为:
cluster\u模式

这是为了提高生产性能而使用的


如果您想对您的电脑进行压力测试,您也可以选择在本地开发人员上执行此操作:)

分叉模式和群集模式之间的主要区别在于,它命令pm2使用api或api

这在内部意味着什么? 分叉模式 将
fork
模式作为基本的进程生成。这允许更改
exec\u解释器
,以便可以使用pm2运行
php
python
服务器。是的,
exec\u解释器
是用于启动子进程的“命令”。默认情况下,pm2将使用
节点
,以便
pm2启动服务器.js
将执行以下操作:

require('child_process').spawn('node', ['server.js'])
这种模式非常有用,因为它提供了很多可能性。例如,您可以在预先建立的端口上启动多个服务器,然后由HAProxy或Nginx进行负载平衡

集群模式
集群
将只与
节点
一起工作,因为它是
执行解释器
,因为它将访问nodejs集群模块(例如:
isMaster
fork
方法等)。这对于零配置流程管理非常有用,因为流程将在多个实例中自动分叉。
例如,
pm2start-i4server.js
将启动
server.js
的4个实例,并让集群模块处理负载平衡。

我仍然感到困惑<代码>集群
内置模块在内部使用子进程?你的建议是,如果我需要灵活的
stdio
,我必须使用Fork模式
stdio
的东西是
pm2
的实现。别担心这个。您希望在生产环境中使用
cluster\u模式
,因为它正在后台运行
-i[number]
实例,因此正在强化您的实例。如果不需要强化,或者您想要更好的日志和内容,请使用
fork\u模式
cluster\u模式
显然会占用更多的系统资源,因为您正在运行
-i[number]
进程。虽然我非常感谢您的回答,但我现在还没有抓住要点。您的大部分解释都是自然现象(例如,
cluster\u模式的CLI使用
cluster\u模式的负载平衡
cluster\u模式
使用了更多资源..)。这就是我没有投票的原因。你能解释两个简单的用例吗?每种情况都必须合理解释为什么会采用这种模式。@Eljefedelrodeljefe您能否解释一下“您必须构建没有状态的应用程序,例如会话、dbs。”?为什么应用程序应该没有状态?根据您在这里的回答提出的问题:我需要一个用例,比如说,我的node.js应用程序的30个实例生成了一个唯一的预定义端口号(:3000到:3030),并让每个实例处理一组特定的用户,这些用户只能访问其指定的端口。因此,我不希望主进程进行负载平衡,而是只启动(并保持运行)子进程。这可能吗?或者它会试图将负载分散到所有派生的子进程上吗?我会使用pm2 programatic API以fork_模式启动30个进程,并使用其他东西作为30个端口之间的负载平衡器。您也可以使用
pm2 start-i 30 app.js
让nodejs集群完成工作。注意:在
集群模式下,主进程是单点故障。thaks,它清除了我脑海中关于NodeJSCreate解释的很多事情!!Node.js不是单线程的,目前有一个userland线程,但它肯定有一个libuv线程池支持。@BenjaminGruenbaum同意你的观点。我的陈述应该被理解为我没有提到太深的诽谤