如何在 Node.js API 中实现优雅关闭(部署时零请求丢失)

发布日期:2026-03-31 10:06:47   浏览量 :4
发布日期:2026-03-31 10:06:47  
4

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

在没有正确实现优雅关闭的情况下部署一个 Node.js API,就如同直接拔掉正在运行的服务器的电源线。每一次滚动部署、每一次 Kubernetes Pod 重启、每一次 Docker 容器停止——如果你的应用忽略了 SIGTERM 信号,就会导致正在进行中的请求被丢弃、数据库事务损坏,并让客户端面对 502 错误。

本指南涵盖了在 2026 年为 Node.js API 正确实现优雅关闭所需的一切内容——从 SIGTERM 信号处理的基础知识,到长连接排空、数据库清理、Kubernetes 配置,以及经过生产环境验证的最佳实践模式。

为什么在 2026 年优雅关闭依然至关重要

现代 API 运行在编排环境中。无论是 Kubernetes、Docker Swarm、ECS,还是简单的 docker compose down 命令——它们都使用相同的关闭流程:

  1. 容器接收到 SIGTERM 信号(礼貌性停止请求)
  2. 编排器等待 terminationGracePeriodSeconds(Kubernetes 默认为 30 秒)
  3. 如果容器仍在运行:则会收到 SIGKILL 信号(强制终止,无法执行清理操作)

常见的两种失败模式如下:

模式一 —— 完全忽略: 应用根本不监听 SIGTERM 信号。Docker 等待 10 秒后直接发送 SIGKILL 信号,所有正在进行的请求都会被中断。

模式二 —— 立即退出: 应用在收到 SIGTERM 信号后立即调用 process.exit(0)。结果相同——请求被丢弃,数据库连接在查询中途被切断。

其代价是:在一个每秒处理 1,000 个请求的繁忙 API 上进行滚动部署时,每次 10 秒的硬性关闭会导致约 10,000 个请求失败。若同时滚动更新 5 个 Pod,则每次部署会产生 50,000 个错误。

最小但正确的实现方式

以下是基础实现——每个 Node.js API 都应包含以下代码:

// server.js
import express from 'express';

const app = express();

app.get('/api/health', (req, res) => res.json({ status: 'ok' }));

app.get('/api/data', async (req, res) => {
  const data = await db.query('SELECT * FROM items LIMIT 100');
  res.json(data);
}

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部