← 中文资源

简体中文版本

优雅停机

优雅停机先停止接收新工作,再排空进行中的请求并关闭资源,避免连接被重置、事务中断或消息丢失。

阅读英文原文

停机顺序

安全顺序是:接收信号、让就绪检查失败或停止监听、等待进行中的请求、关闭资源、退出。先停止新工作至关重要,否则排空永远不会完成,因为新请求持续到达。

const server = app.listen(3000);

async function shutdown(signal) {
  console.log(`${signal} received, draining`);
  server.close(); // 停止接收新连接
  await drainInFlight({ timeoutMs: 20_000 });
  await database.end();
  process.exit(0);
}

process.on('SIGTERM', () => void shutdown('SIGTERM'));
process.on('SIGINT', () => void shutdown('SIGINT'));

server.close() 会停止新连接,但在旧版 Node.js 中不会自动等待所有响应完成;应跟踪活动请求或使用暴露排空完成的库。

截止时间与平台限制

Kubernetes 发送 SIGTERM 后,在 terminationGracePeriodSeconds 之后强制杀死 Pod。排空超时必须短于该期限,为清理留出时间。负载均衡和服务网格也需要时间停止路由到实例;就绪门控通常比仅依赖信号时机更可靠。

何时使用

所有长期运行的服务都需要优雅停机:HTTP API、队列消费者、流处理器和定时任务。与崩溃式设计相比,优雅停机以短暂延迟换取正确性;与检查点相比更简单,但只覆盖能在截止时间内完成的工作。

陷阱

无限等待的排空会阻塞部署。只停止监听器却忘记后台任务仍会丢工作。消费者在处理前确认消息,则无法从中途关闭恢复。停机逻辑应幂等,并通过在慢请求期间发送 SIGTERM 来测试。

相关资源