具体Demo可参考
【SpringBoot+SseEmitter】 和【Vue3+EventSource】 实时数据推送
Q&A
1 这两个超时时间是啥意思?怎么合理设置这两个参数
// 超时时间设置为3s,用于演示客户端自动重连
SseEmitter sseEmitter = new SseEmitter(30000L);
// 设置前端的重试时间为1s
sseEmitter.send(SseEmitter.event().reconnectTime(1000).data(“连接成功”));
在Spring的SSE(Server-Sent Events)实现中,两个超时参数的作用和合理设置如下:
1. SseEmitter(30000L)
(服务器端超时时间)
-
作用:
表示服务器端保持SSE连接的最长空闲时间(单位:毫秒)。如果在30秒内没有向客户端发送任何数据,服务器会主动触发超时(onTimeout
),并关闭连接。这用于防止因客户端异常断开导致服务器资源(如线程、内存)长期被占用。 -
合理设置:
- 如果业务需要频繁推送消息(如实时监控),可以设置较长时间(如几分钟)。
- 如果客户端可能长期无操作,但需保持连接,需权衡资源消耗,建议设置1-5分钟。
- 注意:超时后,服务器会移除对应的
SseEmitter
,客户端需重新调用/subscribe
建立新连接。
2. reconnectTime(1000)
(客户端重试时间)
-
作用:
通过SSE协议中的retry
字段告诉客户端:在连接断开后,应等待多少毫秒(这里是1秒)再尝试重连。这是客户端行为,与服务器无关。 -
合理设置:
- 若需快速恢复连接(如实时聊天),设为1-3秒。
- 若对实时性要求不高,或避免服务器压力,可设为5-10秒。
- 注意:重试时间不宜过短,否则可能导致客户端频繁重试,增加服务器负载。
两者的关系与协作
-
典型场景:
- 客户端连接后,服务器30秒内未发送数据 → 触发服务器超时,关闭连接。
- 客户端收到关闭事件后,等待1秒(
retry
值)自动重连。 - 客户端重新调用
/subscribe
,服务器生成新的SseEmitter
。
-
关键原则:
- 服务器超时应显著大于客户端重试时间,避免客户端重试时服务器已超时。
例如:服务器设为30秒,客户端重试1秒是合理的;若服务器设为3秒,客户端重试5秒,则重试时服务器可能已超时。
- 服务器超时应显著大于客户端重试时间,避免客户端重试时服务器已超时。
配置建议
参数 | 场景建议 | 示例值 |
---|---|---|
服务器超时(SseEmitter ) |
高频消息推送 | 300000(5分钟) |
低频消息或资源敏感场景 | 60000(1分钟) | |
客户端重试(reconnectTime ) |
快速恢复的实时应用 | 1000(1秒) |
一般场景或减少服务器压力 | 5000(5秒) |
完整示例
// 服务端超时:5分钟(适合低频但需长连接的场景)
SseEmitter emitter = new SseEmitter(300_000L);
// 客户端重试:3秒(平衡实时性和服务器压力)
emitter.send(SseEmitter.event().reconnectTime(3000).data("Connected!"));
通过合理配置这两个参数,可以在实时性、用户体验和服务器资源之间找到最佳平衡。
2 客户端和服务端如何判断SSE连接断开?
客户端判断连接断开的方式:
- 监听事件:
客户端通过监听SSE的onerror
或onclose
事件来感知连接断开。例如:const eventSource = new EventSource("/subscribe?id=123"); eventSource.onerr