集群模式
集群模式
集群模式允许联网的Node.js应用程序(http(s)/tcp/udp服务器)在所有可用的cpu上扩展,无需任何代码修改。根据可用cpu的数量,这将极大地提高应用程序的性能和可靠性。在底层,它使用Node.js集群模块,这样伸缩后的应用程序的子进程就可以自动共享服务器端口。要了解更多信息,请参阅cluster模块是如何工作的。
用法
要启用集群模式,只需传递 -i
选项:
$ pm2 start app.js -i max
max
意味着 PM2
将自动检测可用 CPU 的数量并运行尽可能多的进程
或者通过js/yaml/json 文件:
module.exports = {
apps : [{
script : "api.js",
instances : "max",
exec_mode : "cluster"
}]
}
注意
您需要将 exec_mode
设置为cluster
让 PM2
知道您想要在每个实例之间进行负载平衡
然后启动进程文件:
$ pm2 start processes.json
该-i
或实例选项可以是:
- 0/max将应用程序分布到所有 CPU
- -1将应用程序分布到所有 CPU - 1
- number将应用程序分布在多个CPU 上
重新加载
与restart
杀死并重新启动进程相反,reload
实现了0 秒停机时间重新加载。
要重新加载应用程序:
$ pm2 reload <app_name>
或者:
$ pm2 reload process.json
$ pm2 reload process.json --only api
如果重新加载系统未能重新加载您的应用程序,超时将回退到经典重启。
通过脚本关闭连接
在生产环境中,在退出应用程序之前,您可能需要等待剩余的查询被处理或关闭所有连接。在 PM2
重新加载上下文中,它可以转换为非常长的重新加载或不起作用的重新加载(回退到重新启动),这意味着您的应用程序在退出时仍有打开的连接。您可能还需要关闭所有数据库连接、清除数据队列或其他任何内容。
您可以捕获SIGINT信号( PM2
退出时发送的第一个信号)并执行操作以等待/清除所有这些状态:
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0);
});
});
无状态
确保您的应用程序是无状态的,这意味着进程中没有存储本地数据,例如sessions/websocket connections
、session-memory
和related
。使用 Redis
、Mongo
或其他数据库在进程之间共享状态。
关于如何编写高效、生产就绪的无状态应用程序的另一个资源是十二因素应用程序宣言。