长连接与连接复用

TCP/HTTP 长连接省去反复握手与慢启动成本;需要与负载均衡、网关的空闲超时协调,避免请求被单方面关闭形成偶发 502。

长连接与连接复用的关键点

长连接省去反复握手与 TLS 协商,也跳过 TCP 慢启动,能明显降低请求延迟与服务器 CPU 消耗。它带来一个必须处理的细节:各层都有空闲超时,如果客户端保活周期长于中间层或服务端的空闲超时,请求就可能被复用到一条对端已关闭的连接上,表现为偶发的连接重置或 502。基本规则是外侧(靠近客户端)的超时短于内侧,逐层递增,并保证关闭走优雅流程。

基本信息

配置客户端空闲超时要短于服务端与负载均衡的空闲超时
收益省握手与 TLS 协商,降低请求延迟与 CPU 消耗
风险超时层级错配导致复用到已关闭连接
典型层客户端库、负载均衡、反向代理、应用服务器、上游连接池

典型使用场景

  • 高并发 API 网关:复用连接降低握手开销,提升单位时间请求量
  • 数据库访问:连接池复用连接,避免频繁建连的认证与内存开销
  • 微服务间调用:长连接减少跨服务的握手与 TLS 开销
  • 移动端保活:在弱网下维持连接,需要与应用前后台策略配合
  • 发布期间连接排空:滚动发布时先停止接收新请求,再等待在途请求完成

超时层级示例

超时层级示例
客户端保活周期    55s
负载均衡空闲超时  75s
网关 keepalive    90s
上游应用空闲关闭  120s

统一规则:外侧(更靠近客户端)超时短于内侧,
逐层递增;任何一层的关闭都走优雅流程,
先停止接收新请求,再等待在途请求完成

常见现象与排查方向

现象可能原因排查方向
偶发 502 或连接重置复用到了已关闭的连接对比客户端保活周期与中间层空闲超时
发布后短暂错误上升连接被硬关闭,在途请求中断检查是否有优雅关闭与连接排空
连接数持续偏高空闲连接未回收检查客户端池的保活与空闲回收配置
首字节时间偏长连接被反复重建统计连接建立次数与握手耗时

使用要点

  • 出现偶发“连接被重置”时先核对整条链路各层的空闲与优雅关闭超时
  • 发布时先摘流再关闭连接:让负载均衡停止转发新请求,等待在途请求完成
  • 客户端池要能检测失效连接并在失败后重建,避免持续复用坏连接
  • 保活探测要有节制:频率过高会带来额外流量与唤醒开销,尤其在移动端
  • 把连接建立次数做成指标:重建频繁说明复用没有生效,收益无从体现
出现偶发“连接被重置”时先核对整条链路各层的空闲与优雅关闭超时,而不是先怀疑应用代码;这类问题多数由超时层级错配导致。
发布期间未做优雅关闭会让在途请求被中断:表现为发布后短暂错误率上升,容易被误判为代码缺陷而浪费时间排查。

易错点

  • 客户端保活周期长于服务端超时,偶发写失败,问题难复现且集中在低峰期
  • 发布时未优雅关闭,旧连接上的请求被中断,错误码随发布时间一起出现
  • 连接池不检测失效连接,坏连接被持续复用,造成小比例持续失败
  • 保活间隔过密,移动端耗电与流量增加,服务端空闲探测开销同步上升
  • 各层超时配置分散在不同团队维护,无人拥有端到端的超时链路视图

数据来源与参考

  • 《TCP/IP 详解》卷 1(Stevens)
  • NGINX 文档:keepalive_timeout
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌