集群环境下的godaddy/terminus多进程Node.js应用优雅关闭方案【免费下载链接】terminusGraceful shutdown and Kubernetes readiness / liveness checks for any Node.js HTTP applications项目地址: https://gitcode.com/gh_mirrors/te/terminus在现代云原生架构中Node.js应用的优雅关闭和健康检查已成为生产环境的关键需求。特别是在集群环境下如何确保多进程应用能够平滑关闭、不丢失请求同时提供Kubernetes就绪性和存活性检查是每个开发者都需要面对的挑战。今天我们将深入探讨godaddy/terminus这个强大的Node.js库它专门为HTTP应用提供优雅关闭和Kubernetes健康检查功能帮助你在集群环境中构建更加可靠的服务。 为什么需要优雅关闭在集群环境中Node.js应用可能会因为多种原因需要重启或关闭滚动更新Kubernetes部署新版本时水平伸缩根据负载自动扩缩容故障恢复节点故障或内存泄漏配置更新环境变量或配置文件变更如果不进行优雅关闭正在处理的请求可能会被中断数据库连接可能无法正确释放导致数据不一致或资源泄漏。 godaddy/terminus的核心功能godaddy/terminus提供了以下关键特性1. 健康检查端点就绪性检查应用是否准备好接收流量存活性检查应用是否仍在正常运行自定义检查数据库连接、外部服务依赖等2. 优雅关闭机制信号处理监听SIGTERM、SIGINT等信号清理钩子在关闭前执行清理操作超时控制防止关闭过程无限期挂起3. Kubernetes集成就绪探针延迟等待探针失败后再真正关闭优雅退出使用exit(0)向Kubernetes报告正常退出️ 集群环境下的特殊考虑在集群环境中使用Node.js的cluster模块时每个工作进程都需要独立的优雅关闭处理。主进程需要协调所有工作进程的关闭顺序确保服务整体平稳下线。关键挑战进程间协调主进程需要通知所有工作进程开始关闭请求完成确保正在处理的HTTP请求完成连接清理关闭数据库连接、Redis连接等资源释放释放文件句柄、内存等资源 安装与基础配置npm install godaddy/terminus --save基础使用示例const http require(http); const { createTerminus } require(godaddy/terminus); const server http.createServer((req, res) { res.end(Hello World); }); createTerminus(server, { healthChecks: { /health: healthCheck, }, onSignal: cleanup, timeout: 1000 }); 集群环境配置指南主进程管理查看示例文件 example/express.cluster.js 了解完整的集群配置。主进程负责创建工作进程并协调关闭// 主进程代码 if (cluster.isPrimary) { // 创建工作进程 for (let i 0; i numCPUs; i) { cluster.fork(); } // 监听SIGTERM信号优雅关闭所有工作进程 process.on(SIGTERM, gracefulClusterShutdown); }工作进程配置每个工作进程都需要独立的terminus配置// 工作进程代码 function run() { const app express(); const server http.createServer(app); const terminusOptions { useExit0: true, beforeShutdown: () { // 等待就绪性检查失败 return new Promise(resolve setTimeout(resolve, 10000)); }, onSignal: () { console.log(开始清理工作); return Promise.resolve(); } }; createTerminus(server, terminusOptions); server.listen(8080); } Kubernetes最佳实践1. 就绪探针配置在Kubernetes部署中合理配置就绪探针非常重要readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 12. 优雅关闭延迟使用beforeShutdown选项确保Kubernetes有足够时间将Pod从服务中移除beforeShutdown: () { // 等待就绪探针失败 const waitMS 10000; // 与periodSeconds * failureThreshold匹配 return new Promise(resolve setTimeout(resolve, waitMS)); }3. 使用exit(0)设置useExit0: true向Kubernetes报告正常退出createTerminus(server, { useExit0: true, // ... 其他配置 }); 监控与日志健康检查状态监控成功响应HTTP 200包含{status: ok}失败响应HTTP 503包含{status: error}关闭过程日志在关键阶段添加日志记录onSignal: () { console.log(收到关闭信号开始清理); return Promise.all([ closeDatabaseConnections(), finishPendingRequests() ]); }, onShutdown: () { console.log(清理完成准备退出); return Promise.resolve(); } 工作进程优雅关闭流程查看 lib/terminus.js 中的实现了解完整的关闭流程接收信号SIGTERM、SIGINT等标记关闭状态设置isShuttingDown true执行beforeShutdown等待就绪探针失败停止HTTP服务器停止接受新请求执行onSignal清理资源数据库连接等执行onShutdown最终清理操作退出进程使用exit(0)或重新发送信号️ 错误处理策略1. 健康检查错误使用HealthCheckError提供详细的错误信息const { HealthCheckError } require(godaddy/terminus); throw new HealthCheckError(数据库连接失败, { database: 连接超时, redis: 正常 });2. 关闭过程错误配置logger函数记录关闭过程中的错误logger: (message, error) { console.error(关闭过程错误:, message, error); } 性能优化建议1. 超时设置根据应用复杂度设置合理的超时时间timeout: 30000, // 30秒给复杂清理操作足够时间2. 并发清理使用Promise.all并行执行清理操作onSignal: () { return Promise.all([ closeDatabase(), clearCache(), finishWebSocketConnections() ]); }3. 内存优化在关闭过程中释放不必要的内存onSignal: () { // 清理缓存 cache.clear(); // 释放大对象 largeObject null; return Promise.resolve(); } 实际应用场景场景1数据库连接管理onSignal: async () { console.log(关闭数据库连接); await mongoose.disconnect(); await redisClient.quit(); await mysqlPool.end(); }场景2消息队列处理beforeShutdown: async () { // 停止接收新消息 await messageQueue.stopConsuming(); // 等待处理中的消息完成 await waitForPendingMessages(); }场景3文件上传处理onSignal: async () { // 完成正在上传的文件 await finishUploadsInProgress(); // 关闭文件句柄 await closeFileHandles(); } 调试技巧1. 手动触发关闭# 向进程发送SIGTERM信号 kill -15 PID2. 查看健康状态# 检查健康端点 curl http://localhost:8080/health3. 监控关闭过程// 添加详细的日志记录 logger: (msg, err) { console.log([${new Date().toISOString()}] ${msg}, err); } 进阶配置选项查看 typings/index.d.ts 了解完整的TypeScript类型定义选项类型默认值说明healthChecksObject{}健康检查端点配置timeoutnumber1000关闭超时时间毫秒signalstringSIGTERM监听的信号signalsArray[]监听的信号数组useExit0booleanfalse是否使用exit(0)退出beforeShutdownFunctionnoop关闭前执行的函数onSignalFunctionnoop收到信号时执行的清理函数onShutdownFunctionnoop关闭前最后执行的函数 常见问题解决问题1关闭过程卡住可能原因清理操作耗时过长解决方案增加timeout值或优化清理逻辑问题2健康检查失败可能原因依赖服务不可用解决方案实现降级策略或超时控制问题3Kubernetes Pod无法正常终止可能原因就绪探针延迟不够解决方案调整beforeShutdown等待时间 总结godaddy/terminus为Node.js应用在集群环境下的优雅关闭提供了完整的解决方案。通过合理配置健康检查、信号处理和清理钩子你可以确保应用在Kubernetes集群中平稳运行、优雅关闭。关键要点每个工作进程都需要独立的terminus配置主进程需要协调所有工作进程的关闭Kubernetes集成需要合理配置就绪探针和关闭延迟错误处理和日志记录对于调试至关重要通过本文的指南你应该能够在集群环境中成功部署使用godaddy/terminus的Node.js应用实现真正的零停机部署和优雅关闭。本文基于 godaddy/terminus 项目文档和示例编写更多详细信息请参考项目文档。【免费下载链接】terminusGraceful shutdown and Kubernetes readiness / liveness checks for any Node.js HTTP applications项目地址: https://gitcode.com/gh_mirrors/te/terminus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考