You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在关闭现有请求前停止接收新请求?实现与术语疑问

关于Node.js服务器优雅停机的问题解答

1. 现有停机方式并非最优方案

你的代码逻辑存在几个可以优化的点:

  • 调用顺序不合理:server.close() 本身就会停止服务器接受新连接,不需要先调用 closeIdleConnections() 和 closeAllConnections()。反过来先强制关闭所有连接,会直接中断正在处理的请求,影响用户体验。
  • 强制关闭所有连接过于粗暴:closeAllConnections() 会终止所有连接,包括正在处理请求的活跃连接,这会让客户端收到错误响应(比如ECONNRESET),不符合优雅停机的要求。
  • 超时逻辑与server.close回调存在冲突:你同时设置了3秒超时退出和server.close的回调退出,可能导致服务器还没完成优雅关闭流程就被强制退出。

最优的优雅停机流程应该是:

  1. 调用 server.close() 立即停止接受新连接。
  2. 调用 server.closeIdleConnections() 关闭所有空闲的持久连接(这类连接没有正在处理的请求,关闭不会影响用户)。
  3. 等待正在处理的请求完成,若超过设定的超时时间(比如3秒),再强制终止进程,避免无限等待。
  4. 不要主动调用 closeAllConnections(),除非超时后仍有未结束的连接。

调整后的核心逻辑示例:

process.once('SIGINT', () => {
  console.log('got SIGINT, starting graceful shutdown');

  // 停止接受新连接
  server.close(err => {
    if (err) {
      console.error(err);
      process.exit(1);
    }
    console.log('closed server, all connections handled');
    process.exit(0);
  });

  // 关闭空闲连接
  server.closeIdleConnections();

  // 超时兜底,防止僵死
  setTimeout(() => {
    console.log('timeout reached, forcing shutdown');
    process.exit(0);
  }, 3000);
});

2. "idle"连接的定义

在Node.js HTTP服务器中,idle连接指的是处于等待状态的HTTP持久连接(Keep-Alive连接):

  • 这类连接已经完成了之前的请求响应,但客户端和服务器没有立即断开,而是保持连接以复用处理后续请求。
  • 此时连接上没有正在传输的请求或响应数据,处于空闲等待状态,关闭这类连接不会影响正在进行的业务处理。

内容的提问来源于stack exchange,提问作者Alexander Mills

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:42:42