SSE重试需主动控制:区分初始失败与中途断连,离线时暂停;采用指数退避+随机抖动(首延迟1000±500ms,上限30s),5次后提示用户手动重试;重连时通过URL传Last-Event-ID;配合心跳、online/offline监听防假死。

网络不稳定时,SSE 重试不能靠浏览器默认机制硬扛,得主动控制节奏、识别真实原因、配合服务端协同,否则容易触发重连风暴或消息堆积。
明确重试的触发边界
不是所有失败都该重试:
-
readyState === 0且从未进入1(OPEN),大概率是初始连接失败(DNS、CORS、4xx)→ 不宜立即重试,先做预检 -
onerror触发 +readyState === 0+ 已成功接收过带id的消息 → 判定为中途断连,才启动可控重试 -
navigator.onLine === false时,直接暂停重试,等online事件再恢复
用指数退避+随机抖动控制重试节奏
固定 3 秒重连在弱网下会雪崩。应手动接管:
- 首次延迟设为
1000 ± 500ms(避免集群同步请求) - 后续延迟按
Math.min(1000 * Math.pow(2, attempt), 30000)计算 - 每次加
± 当前延迟值的 50%随机偏移 - 超过 5 次重试后停止自动重连,改为提示用户“网络不稳定,点击重试”
重连时带上断点信息,避免重复或丢失
刷新或断连后,浏览器不会自动传 Last-Event-ID,前端要主动补:
- 收到每条带
id的消息时,存入localStorage或内存变量 - 重建
EventSource时,把最后 ID 拼进 URL:/api/sse?last_id=12345 - 服务端优先读取该参数, fallback 到请求头
Last-Event-ID
配合心跳与状态监听防假死
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 服务端每 25 秒发一次
event: heartbeat,前端监听并重置超时计时器 - 页面切后台时保留连接不关闭,但暂停 UI 更新;切回前台时检查
readyState,异常则手动重建 - 监听
online/offline事件,离线时.close()当前实例,上线后按策略重启
不复杂但容易忽略。

















