当SSE 连接因网络中断、服务器进程退出、负载均衡器超时等原因断开时,浏览器会自动执行重连流程:首先关闭当前EventSource连接,等待retry:指定的毫秒数(默认约3000毫秒),然后自动重新发起HTTP GET请求到原始SSE端点URL,并在请求头中附带Last-Event-ID字段。该流程会持续进行,直到连接成功建立或开发者主动调用eventSource.close()。
服务器可通过在事件流中下发retry: <毫秒数>\n\n来动态控制客户端的重连等待时间。例如在服务器即将重启前,可先向所有在线客户端下发retry: 30000\n\n,告知客户端30秒后再重连,从而避免在服务器重启期间产生大量无效的重连请求。也可针对不同网络质量的客户端下发不同的重连间隔,优化整体重连流量。
在SSE 长连接长时间没有数据推送的情况下,中间网络设备(如NAT网关、运营商级NAT)可能会认为连接已空闲而主动关闭TCP连接。解决方案是服务器定期发送心跳消息(通常是一条注释行,如: heartbeat\n\n,以:开头的行被协议定义为注释,不会被客户端当作消息处理,但会触发HTTP层的数据发送,从而保持TCP连接活跃)。
虽然浏览器提供了内置自动重连,但在某些场景下开发者需要更精细的控制:如限制最大重连次数、采用指数退避算法避免雪崩、在网络从离线恢复后立即触发重连等。实现方式为:监听EventSource的onerror事件,在回调中主动调用eventSource.close()关闭当前连接,然后自行通过setTimeout控制重连节奏并创建新的EventSource对象。