站内通知(SSE)断开重连排查
现象
浏览器控制台反复报 ERR_HTTP2_PROTOCOL_ERROR 200 (OK) 之类的连接中断错误;通知消息要刷新页面才能看到;该请求按固定间隔断开重连。
原因
站内通知走 SSE 长连接(/api/notify/user/sse/connect):握手成功、响应头立即返回,之后靠服务端周期性心跳维持。链路中间任何一层「等待数据超时」小于心跳间隔(当前版本心跳为 10 秒),都会在浏览器已收到 200 之后把连接掐断,前端自动重连,表现为「周期性断连」。
注意 200 表示握手成功:这不是缓存问题,也不是鉴权或后端报错,而是流建立后被中间层终止。
真实案例:2026-09 演示站前置腾讯云 EdgeOne 后,站内通知连接固定 20~40 秒断开一次, 浏览器报
ERR_HTTP2_PROTOCOL_ERROR 200 (OK);本地不经过 CDN 的同款部署长时间稳定, 定位为 CDN 边缘的回源等待超时。
处置(以 EdgeOne 为例)
- 回源超时要大于心跳间隔:在规则引擎针对
/api/notify/*设置回源超时(源站/首字节超时),建议 60 秒,远大于 10 秒的心跳间隔,留足余量 - 不缓存:
/api/notify/*需配置不缓存;已按 CDN 部署注意事项 配置 API 全路径不缓存规则的话这条已覆盖。注意「不缓存」解决的是缓存问题,回源超时是独立配置项,两者都要 - 环境配对:EdgeOne 规则按「中国大陆 / 全球」两套环境分别生效,站点解析到境内节点就必须配到「中国大陆」环境,配错不生效
- HTTP/2 可作辅助判别:临时关闭 HTTP/2 走 HTTP/1.1,若断流消失,说明是 CDN 对 h2 长连接的处理问题
自查
浏览器开发者工具 Network 面板观察该 SSE 请求的断开时刻,每次都断在相近的固定秒数,说明是链路中某一层的超时在掐流;再对照直连源站(不经过 CDN)的环境,若直连稳定、过 CDN 复现,即可锁定 CDN 层。