SpringBoot+SseEmitter实现SSE实时推送

具体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秒。
    • 注意:重试时间不宜过短,否则可能导致客户端频繁重试,增加服务器负载。

两者的关系与协作

  • 典型场景

    1. 客户端连接后,服务器30秒内未发送数据 → 触发服务器超时,关闭连接。
    2. 客户端收到关闭事件后,等待1秒(retry值)自动重连。
    3. 客户端重新调用/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的 onerroronclose 事件来感知连接断开。例如:
    const eventSource = new EventSource("/subscribe?id=123");
    eventSource.onerr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值