长连接重连需采用指数退避策略,结合连接状态监听、网络与服务可用性检查、资源清理及消息同步。具体包括:监听onclose/onerror事件判断断开;重试延时= min(60s, 1s×2ⁿ)+随机抖动;重连前校验network.onLine、/health接口及token有效性;成功后同步seq、重发未ACK消息并重置心跳。

长连接心跳超时后,重连重试不能只靠简单轮询,需兼顾连接状态判断、退避策略、失败兜底和资源清理。核心是:检测到断开后不立即重试,而是按指数退避延时,并在每次重连前确认网络可用性与服务端可访问性。
监听断开并触发重连逻辑
WebSocket 或自定义长连接(如基于 fetch + ReadableStream 的 HTTP/2 连接)应监听 onclose、onerror 等事件,避免依赖心跳定时器单点判断。心跳只是探测手段,真正可靠的是连接自身的状态回调。
- WebSocket 示例中,
readyState === WebSocket.CLOSED || readyState === WebSocket.CONNECTING可作为重连依据,而非仅看心跳响应超时 - 若使用 EventSource,监听
onerror并检查eventSource.readyState === 0表示已断开 - 避免在心跳回调里直接调用
connect(),应统一交由重连控制器调度
实现带退避的重试调度
固定间隔重试容易打爆服务端或触发防火墙限流。推荐采用指数退避(Exponential Backoff),初始延迟 1s,每次失败翻倍,上限设为 30–60s,同时加入随机抖动(jitter)防雪崩。
- 基础公式:
delay = Math.min(maxDelay, baseDelay * Math.pow(2, attempt)) + Math.random() * 1000 - 记录当前重试次数
retryCount,连接成功后重置为 0;连续失败达阈值(如 10 次)可暂停自动重连,转为手动触发或上报监控 - 使用
setTimeout而非setInterval,确保每次重连完成后再计算下一次延时,避免任务堆积
重连前做轻量级可行性检查
盲目重连可能浪费资源。可在发起连接前快速验证基础条件:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 检查
navigator.onLine(注意:它只反映浏览器网络开关状态,非真实连通性) - 对关键接口发起 HEAD 请求(如
/health),超时设为 3s,失败则跳过本次重连 - 若应用有登录态,确认 token 未过期;过期则先刷新 token 再重连,避免反复因鉴权失败断开
连接恢复后的状态同步与消息补发
重连成功不等于业务就绪。需主动同步上下文,防止消息丢失或错乱:
- 发送重连标识(如
{"type":"reconnect","seq":lastSeq}),服务端据此补推离线期间的变更消息 - 客户端本地暂存未 ACK 的发送消息(带唯一 ID 和时间戳),重连后按序重发,服务端做幂等去重
- 重置心跳计时器,重新启动心跳包发送与超时检测逻辑,避免新连接刚建立就误判超时
不复杂但容易忽略的是:重连过程中要销毁旧连接对象(如 ws.close())、清除旧定时器、取消挂起的请求,否则可能引发内存泄漏或重复回调。

















