You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constcluster=require('cluster');consthttp=require('http');constnumCPUs=require('os').cpus().length;if(cluster.isMaster){console.log(`Master ${process.pid} is running`);// Fork workers.for(leti=0;i<numCPUs;i++){cluster.fork();}cluster.on('exit',(worker,code,signal)=>{console.log(`worker ${worker.process.pid} died`);});}else{// Workers can share any TCP connection// In this case it is an HTTP serverhttp.createServer((req,res)=>{res.writeHead(200);res.end('hello world\n');}).listen(8000);console.log(`Worker ${process.pid} started`);}
1. fork模式
fork模式使用最基本的进程运行方式,只是单实例运行server,无法实现TCP连接共享;好处是可以修改exec_interpreter,使用pm2运行js之外的语言,例如
php
或者python
2. cluster模式
利用Node.js Cluster模块实现,只能用于启动
node
进程,无法应用于其他语言。可以启动多个server实例,并在各个实例之间实现负载均衡而且共享TCP连接,可以提升服务器的响应性能。2.1 node.js cluster模块简介
cluster用于运行一些可以共享TCP连接的worker进程,首先创建一个master进程,随后根据设置的次数fork出相应的workers,master和workers通过进程间通信(IPC)实现TCP句柄等数据交换,cluster模块自带负载均衡,默认使用Round-Robin算法实现,master监听TCP端口,并根据RR算法将请求交给钦定的worker进行处理。
cluster代码实现:
pm2内置了以cluster模式启动server的方式,不需要对代码进行改动,只需要生成自己的http server:
随后:
4
表示启动4个server实例,输入0可以以机器CPU核心数来启动server实例。2.2 即时调整集群
pm2通过
scale
命令即时调整集群数,如果线上运行时发现worker数不足以支撑请求,可以使用添加三个server实例。
2.3 无缝重启
pm2 reload <app name>
可以重启app对应的所有worker,重启对于每一个worker,会在一个新的worker生成之后再kill掉之前的worker,这样即便是在对服务器进行更新时,也可以正常处理用户的请求,做到无缝升级重启。同时可以参考pm2的gracefulReload
命令,实现在实例退出之前关闭数据库连接等需要处理的操作:The text was updated successfully, but these errors were encountered: