PM2中的群集和前叉模式差异


89

我已经进行了很多搜索来弄清楚这个问题,但是我没有得到明确的解释。集群应用程序可以扩展而分叉应用程序不能扩展只是一件事?

PM2的公共站点解释说集群模式可以实现这些功能,但是没有人说出Fork模式的优点(也许可以NODE_APP_INSTANCE变)。

我觉得Cluster可能是Fork的一部分,因为Fork似乎被广泛使用。因此,我猜想Fork从PM2的角度讲只是“分叉的过程”,而Cluster则是“可以扩展的分叉的过程”。然后,为什么要使用分叉模式?

Answers:


121

fork_mode和之间的主要区别在于cluster_mode,它命令pm2使用child_process.fork api或集群api。

这在内部意味着什么?

货叉模式

fork模式作为基本过程生成。这允许更改exec_interpreter,以便您可以使用pm2运行phppython服务器。是的,exec_interpreter是用于启动子进程的“命令”。默认情况下,pm2将使用,node因此pm2 start server.js将执行以下操作:

require('child_process').spawn('node', ['server.js'])

此模式非常有用,因为它具有很多可能性。例如,您可以在预先建立的端口上启动多个服务器,然后由HAProxy或Nginx进行负载均衡。

集群模式

cluster只一起工作node,因为它是exec_interpreter(:例如,因为它会进入到集群的NodeJS模块isMasterfork方法等)。这对于零配置流程管理非常有用,因为该流程将在多个实例中自动分叉。例如,pm2 start -i 4 server.js将启动4个实例,server.js并让集群模块处理负载平衡。


3
根据您在此处的答案提出的问题:我有一个用例,例如需要生成30个node.js应用实例,并带有唯一的预定义端口号(:3000至:3030),并让每个实例处理一个特定的用户组,这些用户将仅在其分配的端口上进行访问。因此,我不希望Master进程执行负载平衡,而是只启动(并继续运行)子进程。这可能吗?还是仅尝试将负载分散到所有产生的子进程中?
tamak '16

3
我将使用pm2编程API在fork_mode中启动30个进程,并在30个端口之间使用其他东西作为负载平衡器。您还可以使用pm2 start -i 30 app.js并让nodejs集群完成工作。
soyuka

11
注意:在cluster mode主过程中是单点故障。
Karl Pokus

40

Node.js是单线程的。

这意味着您的Intel四核CPU中只有1个核可以执行该节点应用程序。

它称为:fork_mode

我们将其用于本地开发人员

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

自动平衡即将到来的无状态请求。

同一端口上

我们称之为:cluster_mode

出于生产上的考虑而使用。

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


2
烦死了,这清除了我关于nodejs的许多想法
Agrawal

1
很好的解释!
皮克

1
Node.js不是单线程的,(当前)有一个userland线程,但是它肯定有一个libuv线程池支持。
本杰明·格林鲍姆

1
@BenjaminGruenbaum同意您的观点。我的陈述应在以下假设的前提下理解:我没有深深地提到libuv级别
-haotang

16

文档和资源在这里确实令人误解。

阅读源代码中的内容,唯一的区别似乎是它们使用节点clusterchild_processAPI。由于cluster使用后者,因此您实际上在做同样的事情。stdio旅馆周围发生了许多自定义传球fork_mode。也cluster只能通过字符串而非对象进行通信。

默认情况下,您使用fork_mode。如果通过-i [number]-option,则将进入cluster_mode,通常目标是w / pm2

另外,fork_mode由于,实例可能无法在同一端口上侦听EADDRINUSEcluster_mode能够。这样,您还可以构建应用程序,使其在自动负载平衡的同一端口上运行。您必须通过会话,数据库等无状态构建应用程序。


1
我还是很困惑。cluster内置模块child_process内部使用?您的建议是,如果我需要灵活的功能stdio,我必须使用Fork模式?
Jinyoung Kim

stdio事情是什么pm2“的实现。不用担心 您想cluster_mode在生产中使用它,因为它-i [number]在后台运行实例,因此可以强化您的实例。使用fork_mode如淬火是没有必要或你想更好的日志之类的东西。
eljefedelrodeodeljefe

1
显然cluster_mode,由于您正在运行-i [number]进程,因此显然还会使用系统的更多资源。
eljefedelrodeodeljefe

尽管我非常感谢您的回答,但直到现在我还是没明白这一点。大多数你的解释是一种天然的东西(如CLI的使用cluster_mode,负载平衡cluster_modecluster_mode使用更多的资源。)。这就是为什么我没有投票的原因。您能解释两个简单的用例吗?每个案例必须具有合理的理由才能采用其模式。
Jinyoung Kim

@eljefedelrodeodeljefe您能否解释更多有关“您必须在没有状态的情况下通过会话,数据库等方式构建应用程序”的更多信息?为什么应用程序应该没有状态?
STEN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.