React 前端导航

nodejs PM2 延时退出

nodejs PM2 延时退出

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

但上面这种模式并不适合用在生产环境中,因为 pm2 零延时重启,会导致正在处理的请求直接被销毁,如果数据库没加事务,可能会导致数据库的数据不完整。

处理方法是延时 kill,参数是--kill-timeout。

在启动的app.js中添加 SIGINT 的监听,并在回调中用剩余的timeout时间处理数据。

process.on('SIGINT', function() {
   db.stop(function(error) {
     process.exit(error ? 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

声明:本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。邮箱:farmerlzj@163.com。 本站原创内容未经允许不得转载,或转载时需注明出处: 内容转载自: React前端网:https://qianduan.shop/blogs/detail/37

#node#pm2#优雅退出

相关推荐

NodeJs发起https请求报错:certificate has expired

在egg中发起https请求时提示证书过期错误(certificate has expired)问题记录

Node定时任务怎么做

linux有crontab定时任务,那么在Node中,定时任务该如何实现?