高可用切换时长连接断开,本质是“断后如何不感知、不丢数、不中断业务”,关键在快速重建与状态延续:需心跳保活+应用层探测、连接状态外置化、负载均衡适配、客户端智能重连与消息兜底。

高可用切换时长连接断开,本质不是“连接不该断”,而是“断后如何不感知、不丢数、不中断业务”。关键不在防断,而在快速重建与状态延续。
心跳保活 + 应用层探测,提前发现假死连接
TCP keepalive 默认两小时才触发,完全无法应对 NAT、防火墙、基站切换导致的“静默失效”。必须在应用层主动探测:
- 客户端和服务端约定固定间隔(如30秒)互发 ping/pong 帧
- 连续2–3次无响应即主动关闭本地连接,避免挂死等待
- 服务端对无心跳连接,在超时前主动发送 close 帧,让客户端明确感知而非静默失败
连接状态外置化,解耦节点生命周期
长连接绑定在具体服务实例上,是切换时断连的根源。要把“谁连了”和“连在哪”分开:
- 用户会话 ID、订阅关系、未确认消息等状态存到 Redis 或专用 Session 存储中
- 新节点上线后,通过用户 ID 拉取历史状态,完成上下文重建
- 避免把登录态、房间成员列表等存在 JVM 内存里——节点一重启就全丢
负载均衡层透传与超时适配
Nginx、HAProxy 等中间件默认会杀死空闲长连接,必须显式适配 WebSocket 协议特性:
- Nginx 需配置:proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade"
- proxy_read_timeout 至少设为 300 秒,或设为 0(禁用超时),同时后端心跳间隔要小于该值
- 避免使用 proxy_buffering,防止二进制帧被缓存导致延迟或粘包
客户端智能重连 + 消息兜底机制
断连不可怕,可怕的是重连后消息丢失或重复:
- 客户端采用指数退避策略重连(如 1s → 2s → 4s → 最大 30s)
- 每条消息带唯一 client_seq_id,服务端记录已处理序列号,支持断线重传与幂等去重
- 关键业务消息(如支付确认、订单状态变更)走 MQ 落地,WebSocket 仅作实时通知通道

















