我经常搜索这个问题,但我没有得到明确的解释。群集应用程序可以扩展,分叉应用程序不能只有一个区别吗?
PM2的公共站点解释了群集模式可以these feature,但没有人说过Fork模式的优点(也许,它可以得到NODE_APP_INSTANCE
变量)。
我觉得Cluster可能是Fork的一部分,因为Fork似乎一般都会被使用。因此,我认为Fork意味着从PM2开始只是'分叉过程'而Cluster意味着'分叉过程能够被扩展'。那么,我为什么要使用Fork模式呢?
答案 0 :(得分:90)
fork_mode
和cluster_mode
之间的主要区别在于它命令pm2使用child_process.fork api或cluster api。
将fork
模式作为基本过程产生。这允许更改exec_interpreter
,以便您可以使用pm2运行php
或python
服务器。是的,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)
文档和来源在这里确实存在误导。
在源代码中读到这一点,唯一的区别似乎是,他们使用节点cluster
或child_process
API。由于cluster
使用后者,你实际上也在做同样的事情。只有很多自定义stdio
在fork_mode
旅馆附近传递。此外cluster
只能通过字符串而不是对象进行通信。
默认情况下,您使用fork_mode
。如果您通过了-i [number]
- 选项,那么您将进入cluster_mode
,通常您的目标是pm2
。
由于fork_mode
,EADDRINUSE
实例可能无法在同一端口上侦听。 cluster_mode
可以。这样,您还可以构建应用程序以在自动负载平衡的同一端口上运行。你必须建立没有状态的应用程序然后,例如会议,dbs。