Cluster

集群模式

集群模式 允许联网的 Node.js 应用程序(http(s)/tcp/udp 服务器)在所有可用的 CPU 上扩展,无需任何代码修改。 这极大地提高了应用程序的性能和可靠性,具体取决于可用的 CPU 数量。 在引擎盖下,这使用了 Node.js 集群模块,以便扩展应用程序的子进程可以自动共享服务器端口。 要了解更多信息,请参阅有关集群模块的官方 Node.js 文档中的工作原理

集群模式

用法

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

bash
pm2 start app.js -i max

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

或者通过 js/yaml/json 文件

js
module.exports = {
  apps: [{
    script: 'api.js',
    instances: 'max',
    exec_mode: 'cluster'
  }]
}

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

然后启动进程文件:

bash
pm2 start processes.json

-iinstances 选项可以是:

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

重新加载

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

要重新加载应用程序:

bash
pm2 reload <app_name>

Or:

bash
pm2 reload process.json
pm2 reload process.json --only api

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

优雅关机

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

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

js
process.on('SIGINT', () => {
  db.stop((err) => {
    process.exit(err ? 1 : 0)
  })
})

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

无状态化你的应用程序

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

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