PM2中Cluster和Fork模式的区别

Cluster and Fork mode difference in PM2

我搜索了很多来弄清楚这个问题,但没有得到明确的解释。集群应用程序可以横向扩展和分叉应用程序不能横向扩展只有一个区别吗?

PM2 的 public 站点解释了 Cluster 模式可以做到 these feature 但没有人说 Fork 模式的优点(也许,它可以获得 NODE_APP_INSTANCE 变量)。

我觉得 Cluster 可能是 Fork 的一部分,因为 Fork 似乎被普遍使用。所以,我猜从 PM2 的角度来看,Fork 意味着 'forked process',而 Cluster 意味着 'forked process that is able to be scaled out'。那么,为什么要使用Fork模式呢?

此处的文档和来源确实具有误导性。

在资源中阅读此内容,唯一的区别似乎是,它们使用节点 clusterchild_process API。由于 cluster 使用后者,您实际上也在做同样的事情。只有更多的习俗 stdio 在 happen inn fork_mode 周围传递。另外 cluster 只能通过字符串进行通信,不能通过对象进行通信。

默认情况下您使用 fork_mode。如果您传递了 -i [number]-选项,您将进入 cluster_mode,您通常会以 pm2.

为目标

另外 fork_mode 由于 EADDRINUSE,实例可能无法在同一端口上侦听。 cluster_mode可以。通过这种方式,您还可以在自动负载平衡的同一端口上将您的应用程序构建为 运行。你必须构建没有状态的应用程序,例如会话,数据库。

Node.js是单线程。

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

它调用了:fork_mode

我们将它用于本地开发

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

auto-load-balance无状态请求。

同一个端口

我们称之为:cluster_mode.

用于生产性能

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

fork_modecluster_mode 之间的主要区别是它命令 pm2 使用 child_process.fork api or the cluster api。

这在内部意味着什么?

分叉模式

fork模式作为基本进程生成。这允许更改 exec_interpreter,以便您可以 运行 phppython 服务器与 pm2。是的,exec_interpreter 是用来启动子进程的"command"。默认情况下,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 实例并让集群模块处理负载平衡。