PM2中的簇和叉模式差异
我已经搜寻了很多想知道这个问题,但我没有得到明确的解释。 是否只有一个区别的事情,聚集的应用程序可以扩大和分叉应用程序不能?
PM2的公共站点解释集群模式可以做这些function,但没有人说Fork模式的优点(也许它可以得到NODE_APP_INSTANCE
variables)。
我觉得Cluster可能是Fork的一部分,因为Fork似乎被普遍使用。 所以,我认为Fork意味着从PM2的angular度来说就是“分叉的过程”,而Cluster则意味着“能够被扩展的分叉过程”。 那么,为什么我应该使用叉模式?
fork_mode
和cluster_mode
之间的主要区别在于它命令pm2使用child_process.fork api或者cluster api。
这是什么意思呢?
叉子模式
以fork
模式作为基本的进程产卵。 这允许更改exec_interpreter
,以便您可以使用exec_interpreter
运行php
或python
服务器。 是的, exec_interpreter
是用来启动subprocess的“命令”。 默认情况下,pm2将使用node
以便pm2 start server.js
将执行如下操作:
require('child_process').spawn('node', ['server.js'])
这种模式非常有用,因为它提供了很多可能性。 例如,您可以在预先build立的端口上启动多个服务器,然后通过HAProxy或Nginx进行负载平衡。
集群模式
因为它将访问nodejs集群模块(例如: isMaster
, fork
方法等),所以cluster
只能用于exec_interpreter
node
。 这对零configurationstream程pipe理非常有用,因为stream程将在多个实例中自动分叉。 例如, pm2 start -i 4 server.js
将启动4 pm2 start -i 4 server.js
实例,并让集群模块处理负载平衡。
Node.js是单线程的。
这意味着只有一个英特尔四核CPU的内核可以执行节点应用程序。
它叫: fork_mode
。
我们把它用于本地开发 。
pm2 start server.js -i 0
帮助您在CPU的每个核心上运行1个节点线程。
并自动负载平衡无状态的请求。
在同一个端口上 。
我们称之为: cluster_mode
。
这是用于生产性能的缘故。
或在本地开发事件。
如果你想压力testing你的电脑:)
文档和来源在这里真的是误导。
在源代码中读到这一点,唯一的区别似乎是,它们使用节点cluster
或child_process
API。 由于cluster
使用后者,你实际上也是这样做的。 在客栈fork_mode
周围传递了更多的自定义stdio
。 此外, cluster
只能通过string而不是对象进行通信。
默认情况下你正在使用fork_mode
。 如果你传递了-i [number]
,你将进入cluster_mode
,你通常以w / pm2
为目标。
此外, fork_mode
实例可能无法在相同的端口上EADDRINUSE
。 cluster_mode
可以。 这样你也可以构build你的应用程序在同一个端口上自动运行负载均衡。 你必须build立应用程序没有状态,然后通过例如会话,DBS。