1.集群模式

群集模式允许联网的Node.js应用程序(HTTP(S)/ TCP / UDP服务器)跨可用所有CPU进行缩放,而没有任何代码修改。这会大大提高应用程序的性能和可靠性,具体取决于可用 CPU 的数量。在幕后,它使用 Node.js集群模块,以便扩展应用程序的子进程可以自动共享服务器端口。要了解更多信息,请参阅有关集群模块的官方 Node.js 文档中的How It Works

image.png

2.用法

要启用集群模式,只需传递 -i 选项:

  1. pm2 start app.js -i max

max 意味着 PM2 将自动检测可用 CPU 的数量并运行尽可能多的进程

或者通过js/yaml/json 文件

  1. module.exports = {
  2. apps : [{
  3. script : "api.js",
  4. instances : "max",
  5. exec_mode : "cluster"
  6. }]
  7. }

注意:您需要将 exec_mode 设置为cluster让 PM2 知道您想要在每个实例之间进行负载平衡,默认情况下它不会

然后启动进程文件:

  1. pm2 start processes.json

该-i或实例选项可以是:

  • 0/max将应用程序分布到所有 CPU
  • -1将应用程序分布到所有 CPU - 1
  • number将应用程序分布在多个CPU 上

3.重新加载

restart终止并重新启动进程的 相比,reload实现了0 秒停机时间重新加载。

要重新加载应用程序:

  1. pm2 reload <app_name>

或者:

  1. pm2 reload process.json
  2. pm2 reload process.json --only api

如果重新加载系统未能重新加载您的应用程序,超时将回退到经典重启。

4.正常关机

在生产环境中,在退出应用程序之前,您可能需要等待剩余的查询被处理或关闭所有连接。在PM2 重新加载上下文中,它可以转换为非常长的重新加载或不起作用的重新加载(回退到重新启动),这意味着您的应用程序在退出时仍有打开的连接。您可能还需要关闭所有数据库连接、清除数据队列或其他任何内容。

要正常关闭应用程序,您可以捕获SIGINT信号(PM2 退出时发送的第一个信号)并执行操作以等待/清除所有这些状态:

  1. process.on('SIGINT', function() {
  2. db.stop(function(err) {
  3. process.exit(err ? 1 : 0);
  4. });
  5. });

阅读有关正常关机功能的更多信息

5.无状态化您的应用程序

确保您的应用程序是无状态的,这意味着进程中没有存储本地数据,例如会话/websocket 连接、会话内存和相关数据。使用 Redis、Mongo 或其他数据库在进程之间共享状态。

关于如何编写高效、生产就绪的无状态应用程序的另一个资源是十二因素应用程序宣言