Node 服务怎样优雅退出?PM2 重启能解决什么,不能解决什么?
先理解原理和示例,再练习完整口述与追问。
回答要点
停止接新请求;等待进行中工作;关闭连接与资源;总超时;进程守护与业务正确性分开。
原理拆解
进程收到退出信号后,应先使负载均衡停止转发,再停止接新连接,等待当前请求和必要任务完成,释放数据库、订阅和日志资源,最后退出。等待必须有截止时间,长连接也需按协议结束。信号与关闭行为具有平台和 Node 版本差异,不能把一个 Linux 示例当成所有 Windows 场景。
PM2 等守护可在异常退出后重启、管理多实例与日志,但不会自动恢复未持久化任务,也不能修复崩溃根因。继续运行在未知损坏状态中的 uncaughtException 也不是默认安全策略。
示例与推演
发布新实例先通过健康检查,再撤掉旧实例流量;旧实例等待当前上传或请求到结束上限,超时记录并结束。后台任务有稳定任务 ID 和重试/幂等规则,重启后才能恢复,不依赖某个内存数组一直存在。
易错点
一收到信号就 process.exit 会截断请求与日志;无限等待则无法发布。健康探针还需区分存活与是否可接流量。
参考回答可直接练习口述
我把优雅退出设计成有期限的状态转换,先停新流量、再排空工作、释放资源。守护进程提供恢复能力,业务任务仍需持久化和幂等,崩溃原因则通过日志和监控修复。