服务端主动关闭SSE连接时前端不应默认视为异常,而应通过close事件、自定义响应头或fetch+ReadableStream识别主动关闭信号,据此静默处理、延迟重连或停止重连,并配合服务端预告机制实现平滑切换。

服务端主动关闭 SSE 连接时,前端不能默认当作异常处理——它可能是正常运维(如滚动发布、服务升级)或业务逻辑(如用户登出、会话过期)所致。关键在于区分“服务端有意关闭”和“网络/服务崩溃导致的意外断连”,再决定是否重连、何时重连、是否提示用户。
识别服务端主动关闭的信号
服务端主动关闭通常表现为连接干净断开,而非超时或报错。浏览器 EventSource 会触发 error 事件,但此时 readyState === 0,且响应状态码往往为 200(非错误码)。真正可靠的判断依据来自服务端配合:
- 服务端在关闭前发送一条特殊事件,例如:
event: close\nid: 123\ndata: {"reason":"maintenance","graceful":true} - 服务端返回 HTTP 响应头
X-SSE-Close: graceful或自定义 header(需 fetch 实现才可读取;EventSource 不支持读 header) - 若使用 fetch + ReadableStream 实现 SSE,则可在 response.headers 中检查关闭标识,从而跳过重连
对主动关闭做静默或延迟重连
一旦确认是服务端主动关闭(如收到 close 事件或 header 标识),就不该立即重试,而应尊重服务端意图:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 若消息中含
retry字段(如retry: 30000),按服务端建议间隔重建连接 - 若 reason 是
"maintenance"或"session_expired",可暂停自动重连,转为用户触发(如点击“重连”按钮) - 若 reason 是
"user_logout",直接清理状态、销毁 EventSource,不再重连
避免重连风暴与状态错乱
服务端主动关闭后若盲目重连,容易引发资源竞争或重复初始化问题:
立即学习“Java免费学习笔记(深入)”;
- 重连前清空旧实例,并重置重试计数器(
reconnectCount = 0),防止与上次异常断连的计数混淆 - 使用唯一连接 ID(如时间戳+随机字符串)标记每次连接,在服务端日志和前端调试中可追溯是否为同一逻辑会话
- 若页面处于后台或冻结状态(
document.visibilityState === 'hidden'),延迟重连至页面激活后再执行,避免无意义请求
配合服务端设计更可控的关闭流程
前端行为依赖服务端协作。推荐服务端在主动关闭前预留“预告窗口”:
- 提前 10–30 秒发送
event: warn\ndata: {"countdown": 15, "message": "服务即将重启,请勿提交新操作"} - 客户端收到后禁用关键操作按钮,显示倒计时提示,让用户有准备时间
- 倒计时结束再收到
close事件时,即可平滑切换连接,无需 UI 闪烁或中断感知

















