集群模式

集群模式

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

http://i.imgur.com/kTAowsL.png

用法

要启用集群模式,只需传递 -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

-iinstances 选项可以是

  • 0/max,将应用程序分布到所有 CPU
  • -1,将应用程序分布到所有 CPU - 1
  • 数字,将应用程序分布到数字个 CPU

重新加载

restart 不同,reload 实现了零停机时间重新加载,而 restart 会终止并重新启动进程。

要重新加载应用程序

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);
   });
});

阅读有关优雅关闭功能的更多信息

使您的应用程序无状态化

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

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

为此页面贡献内容