PM2中的Cluster和Fork模式差异

时间:2016-01-08 16:47:32

标签: node.js pm2

我经常搜索这个问题,但我没有得到明确的解释。群集应用程序可以扩展,分叉应用程序不能只有一个区别吗?

PM2的公共站点解释了群集模式可以these feature,但没有人说过Fork模式的优点(也许,它可以得到NODE_APP_INSTANCE变量)。

我觉得Cluster可能是Fork的一部分,因为Fork似乎一般都会被使用。因此,我认为Fork意味着从PM2开始只是'分叉过程'而Cluster意味着'分叉过程能够被扩展'。那么,我为什么要使用Fork模式呢?

3 个答案:

答案 0 :(得分:90)

fork_modecluster_mode之间的主要区别在于它命令pm2使用child_process.fork api或cluster 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群集模块(例如:isMaster,{{1方法等)。这非常适合零配置流程管理,因为该流程将自动分叉到多个实例中。 例如,fork将启动4个pm2 start -i 4 server.js实例,并让群集模块处理负载平衡。

答案 1 :(得分:29)

Node.js是单线程的。

这意味着只有1个Intel四核CPU核心才能执行节点应用程序。

它叫:import javax.swing.*; import java.awt.*; import java.awt.*; import java.awt.image.*; public class Arrangement { public void main(String[] args) { JFrame f= new JFrame(); f.setVisible(true); f.setSize(600,400); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel (new GridBagLayout());//in the constructor u specify the layout :) JPanel a = new JPanel (new GridBagLayout()); Arrangement arr= new Arrangement(); for(int j=0;j<16;j++){ if(j==0) Image img= new ImageIcon(arr.getClass().getResource("/Red.png")).getImage(); //Supposing you followed the link and created the class buttons[j]= new RoundButton("Button "+(j+1)); } GridBagConstraints c= new GridBagConstraints(); GridBagConstraints d= new GridBagConstraints(); c.insets = new Insets(5,5,5,5);//spacing for(int j=0;j<8;j++){ arr.pack(c, 0, j+1,buttons[j],p); } d.insets = new Insets(5,5,5,5); for(int j=0;j<8;j++){ arr.pack(d, 0, j+9,buttons[j+8],a); } f.add(p, BorderLayout.WEST); f.add(a, BorderLayout.EAST); } void pack(Insets target, int xCoord,int yCoord,Component comp, Panel container ){ target.gridx=xCoord; target.gridy=yCoord; container.add(comp, target); }

我们将其用于本地开发

fork_mode可帮助您在CPU的每个核心上运行1个节点线程。

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

相同端口

我们称之为:pm2 start server.js -i 0

用于生产性能

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

答案 2 :(得分:12)

文档和来源在这里确实存在误导。

在源代码中读到这一点,唯一的区别似乎是,他们使用节点clusterchild_process API。由于cluster使用后者,你实际上也在做同样的事情。只有很多自定义stdiofork_mode旅馆附近传递。此外cluster只能通过字符串而不是对象进行通信。

默认情况下,您使用fork_mode。如果您通过了-i [number] - 选项,那么您将进入cluster_mode,通常您的目标是pm2

由于fork_modeEADDRINUSE实例可能无法在同一端口上侦听。 cluster_mode可以。这样,您还可以构建应用程序以在自动负载平衡的同一端口上运行。你必须建立没有状态的应用程序然后,例如会议,dbs。