关于pm2:PM2-优雅退出
在日常开发过程中,常常会用到 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