关于pm2:PM2-优雅退出

58次阅读

共计 809 个字符,预计需要花费 3 分钟才能阅读完成。

在日常开发过程中,常常会用到 pm2 来起到服务,甚至会用 watch 来实现热更新。

但下面这种模式并不适宜用在生产环境中,因为 pm2 零延时重启,会导致正在解决的申请间接被销毁,如果数据库没加事务,间接就会导致数据库的数据不残缺。

解决办法是延时 kill,参数是 –kill-timeout。

在启动的 app.js 中增加 SIGINT 的监听,并在回调中用残余的 timeout 工夫解决数据。

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

启动形式如下:

pm2 start app.js --kill-timeout 3000

重载就会触发。

pm2 reload

理论问题

个别应用 pm2,咱们是心愿 pm2 给咱们提供负载平衡,每次 pull 好代码,reload 一下就能降级到最新的服务,而不须要从 Nginx 上下手。然而默认状况下 pm2 间接重启会导致正在解决的申请失落。所以咱们心愿 PM2 在重启前,能够先告诉 App,并给足够的工夫让 App 解决完正在解决的申请,并且不再接管新的申请,而后再重启服务。

咱们能够把下面的例子改成这样。

process.on('SIGINT', function() {
    global.app.running = false;
    db.stop(function(err) {process.exit(err ? 1 : 0)
   })
})

global.app.running 为整个服务的全局变量,只有服务启动就赋值为 true,并且在所有理由拦截器中减少判断逻辑:只有 true 时才接管申请,这样就能保障当 global.app.running 为 false 时,正在解决的申请不会被销毁,所有起初进入的申请都失败,从而保障数据库完整性。

然而这种拦挡形式太过于粗犷,只是保障数据库残缺,然而仍然达不到平滑,平滑降级还有很多路要走。

参考链接

Graceful Stop

正文完
 0