PM2 优雅退出

在生产环境中,使用PM2时遇到的问题是直接重启可能导致正在处理的请求丢失,造成数据不完整。解决方案是通过`--kill-timeout`参数实现延时退出,允许应用在关闭前处理完现有请求。在app.js中监听SIGINT信号,利用剩余时间完成数据处理。此外,通过设置全局变量控制是否接收新请求,确保平滑升级并保护数据库完整性。然而,这种策略虽能防止数据不完整,但并非完全平滑,平滑升级还需要更精细的处理。
摘要由CSDN通过智能技术生成

原文地址: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() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FarmerLZJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值