当前位置: 首页 > news >正文

使用 PM2 部署 Node.js 应用时怎么配置重启策略避免异步任务中断丢失

最稳妥的方案是在代码中实现优雅退出逻辑,配合 PM2 的 kill_timeout 配置,并在更新时使用 reload 命令而非 restart。

先说结论:单纯依赖 PM2 配置无法完全保证异步任务不丢失,必须结合代码层的优雅关闭处理。

  • 适合:有定时任务、消息队列消费或长连接服务的 Node.js 应用
  • 先准备:确认代码中监听了 SIGINT 和 SIGTERM 信号,并持有 server 实例
  • 验收:通过手动发送停止信号观察日志中是否有"Server closed"字样

原理简述

PM2 在重启应用时,默认行为是先发送 SIGTERM 信号,等待 kill_timeout 设定的时间。如果超时后进程仍未退出,PM2 会发送 SIGKILL 强制杀死进程。这意味着正在执行的异步操作(如数据库写入、文件上传)若未在超时窗口内完成,会被强制截断。

实战代码:Express 服务优雅关闭完整示例

以下代码展示了如何监听信号、停止接收新请求、等待现有请求完成后再关闭服务器。

const express = require('express');
const app = express();
const server = app.listen(3000);let isShuttingDown = false;
let pendingRequests = 0;// 中间件:统计正在处理的请求
app.use((req, res, next) => {if (isShuttingDown) {return res.sendStatus(503); // 拒绝新请求}pendingRequests++;res.on('finish', () => {pendingRequests--;checkExit(); // 请求完成后检查是否可退出});next();
});function checkExit() {if (isShuttingDown && pendingRequests === 0) {server.close(() => {console.log('Server closed successfully');process.exit(0);});}
}// 监听终止信号
process.on('SIGTERM', () => {console.log('SIGTERM received, starting graceful shutdown');isShuttingDown = true;checkExit();
});process.on('SIGINT', () => {console.log('SIGINT received, starting graceful shutdown');isShuttingDown = true;checkExit();
});

PM2 配置文件参考

在 ecosystem.config.js 中调整超时时间和重启策略。kill_timeout 需大于业务中最长异步任务的耗时。

module.exports = {apps: [{name: 'my-app',script: './app.js',kill_timeout: 10000, // 建议 10s 以上,根据业务耗时调整,单位毫秒max_memory_restart: '1G',instances: 4, // 集群模式exec_mode: 'cluster'}]
}

部署与验证命令

# 更新应用时零宕机重载(推荐)
pm2 reload all# 查看应用状态及重启次数
pm2 list# 监控日志观察退出过程(修正语法)
pm2 logs `--lines` 100

验证是否生效

1. 触发重启:运行 pm2 reload all 或手动发送信号 kill -SIGTERM <pid>
2. 观察日志:pm2 logs 中搜索以下关键词:
  - SIGTERM received, starting graceful shutdown(表示信号已接收)
  - Server closed successfully(表示连接已安全关闭)
3. 检查数据:确认数据库或文件系统中没有产生残缺数据,且 PM2 状态栏中重启次数(restart count)未异常增加。

常见坑与排查

1. 直接调用 process.exit():代码中若直接调用 process.exit(0) 会跳过 server.close() 回调,导致连接强制断开。
2. kill_timeout 设置不当:设置过短(如 3000ms)可能导致长任务被强制杀死;设置过长会导致部署变慢。建议根据业务最长耗时预留 2-3 倍缓冲。
3. 集群模式协调:在 cluster 模式下,PM2 会向每个实例发送信号。确保每个实例都能独立处理关闭逻辑,不要依赖进程间共享变量判断退出状态。
4. 定时器未清除:除了 HTTP 请求,若有 setInterval 等定时器,需在关闭逻辑中手动 clearInterval,否则进程无法退出。

参考来源

  • PM2 Official Documentation - Graceful Shutdown, https://pm2.io/doc/en/runtime/guide/graceful-shutdown/
  • PM2 Official Documentation - Memory Management, https://pm2.io/doc/en/runtime/guide/memory-management/

原文链接:https://www.zjcp.cc/ask/10951.html

http://www.jsqmd.com/news/805462/

相关文章:

  • 观察taotoken用量看板如何清晰呈现各模型token消耗
  • 2026年GEO行业格局解析:最新全域技术型与垂直深耕型十大服务商实力对比 - GEO优化
  • 3步免费获取公式识别神器:img2latex-mathpix本地部署终极指南
  • Python爬虫实战:构建智能职位信息聚合工具JobClaw
  • 2026年当下,探寻重庆全屋翻新口碑标杆:快装巴士为何受青睐? - 2026年企业推荐榜
  • 贾子竞争哲学与中国 AI 道层跃迁之路
  • libhv实战:300行构建C++异步RPC框架,集成Protobuf与evpp
  • Spratt Skills:基于LLM规划与代码执行的OpenClaw家庭自动化架构实践
  • 2026年至今,四川地区可靠的成都实木门批发优选推荐 - 2026年企业推荐榜
  • Articuler.Ai 技术深度解析:海量人脉匹配、数字足迹解析与高转化冷触达引擎
  • Python 爬虫高级实战:爬虫接口限流自适应调节
  • Verilog移位运算避坑指南:为什么你的`reg1 << (a+b+3‘d4)`结果总不对?
  • 基于MCP协议与FFmpeg构建AI视频处理服务器:原理、部署与实战
  • Poppler Windows终极指南:3步搞定Windows平台PDF处理难题
  • 8720个AI岗位真相:LLM和Agent吃掉58%的岗位
  • 淘金币自动化脚本:3分钟完成淘宝全任务,每天节省20分钟
  • LayerDivider终极指南:5分钟掌握智能插画分层技术
  • 四川弱电劳务分包技术规范与合规服务商实操推荐 - 优质品牌商家
  • SRWE终极指南:5分钟学会游戏窗口分辨率自定义技巧
  • ARMv8存储释放指令原理与应用详解
  • Clawforce:开源AI智能体团队基础设施,实现持久化与安全协作
  • 贾子之路理论体系与六步实施路径详解
  • 2026届学术党必备的六大降重复率平台推荐榜单
  • Krita AI智能选区工具:3分钟掌握专业级图像分离技术
  • Notero终极指南:打通Zotero与Notion的学术工作流桥梁
  • 终极指南:如何让淘宝淘金币任务全自动完成,每天节省20分钟
  • 如何解锁数字化制造的数据瓶颈:stltostp的轻量级STL转STEP解决方案
  • 告别显示器:树莓派4B无头模式(Headless)安装系统与VNC远程桌面配置详解
  • 【AI面试临阵磨枪-53】AI 应用成本优化:模型选型、Token 控制、缓存、异步、轻量降级
  • 2026年q2四川弱电工程服务商实力排行一览:停车场道闸安装/小区道闸安装/工地道闸安装/弱电劳务分包/优选指南 - 优质品牌商家