← 中文资源

简体中文版本

连接排空:下线实例时不丢请求

连接排空先把实例移出流量轮转,再等待在途请求完成,把硬切换变成对客户端不可见的交接。

阅读英文原文

两个阶段,一次交接

排空分为两个阶段。第一,把实例移出路由:负载均衡器停止发送新请求,注册中心把该端点标记为即将离开。第二,进程继续服务,直到在途请求完成或到达截止时间。跳过任一阶段都会造成连接被断开。

关闭顺序为什么重要

常见错误是先关闭监听端口再休眠。休眠毫无作用,因为新连接已被拒绝,而负载均衡器仍认为实例健康。正确顺序是:就绪检查失败、等待负载均衡器感知、停止接受新连接、完成在途工作、再退出。

lifecycle:
  preStop:
    exec:
      command: ["sh", "-c", "sleep 15"]
terminationGracePeriodSeconds: 60

preStop 的停顿用于覆盖从注销到最后一条被路由请求之间的窗口;优雅期必须大于最慢的合法请求耗时。

窗口怎么定

排空窗口应根据实测请求时长设定,而不是凭直觉。若 p99 为 1.5 秒而批处理端点可能运行 40 秒,5 秒排空就会切断批处理。要统计关闭期间被中断的连接数,非零即告警。

与硬切换的对比

硬切换更简单,适用于无状态、短请求且重试层足够快的服务。排空的代价是发布变慢,但能保护长连接、流式响应以及不做重试的客户端。多数平台应默认排空,只有在有证据时才缩短窗口。