SSE 在服务器有新数据时立即推送,延迟通常仅为网络RTT(往返时间)级别(几毫秒到几十毫秒)。长轮询虽然也将服务器响应保持打开一段时间,但每次消息推送完成后客户端仍需重新发起请求,引入了额外的请求建立延迟;且如果服务器端在保持期间没有新数据,请求会因超时返回空响应,进一步增加消息传递延迟。
SSE 为每个客户端维持一个长期HTTP连接,连接建立后的每次消息推送仅需写入响应体,开销极小。长轮询则需要为每个客户端周期性地建立HTTP连接、执行服务端处理逻辑、返回响应、然后关闭连接,在高并发场景下会显著增加服务器CPU和数据库连接池的压力。对于消息频率较低的应用,长轮询的部分请求会空等超时,造成资源浪费。
SSE 的客户端实现极为简单:创建一个EventSource 对象,注册onmessage或addEventListener回调即可,浏览器自动处理重连、Last-Event-ID续传等复杂逻辑。长轮询的客户端则需要自行实现:发起AJAX请求、处理响应、立即或等待一小段时间后再次发起请求、处理请求失败和超时、实现退避重连策略等,代码复杂度明显更高。
SSE 复用单一HTTP长连接,减少了TCP握手、SSL握手的频次,对网络基础设施更友好。长轮询频繁建立短连接,在HTTPS场景下每次连接都需进行TLS握手(虽然TLS 1.3已大幅优化,但仍有开销),在高延迟移动网络下性能差距更为明显。但长轮询的优势在于兼容性极佳,可穿透所有HTTP代理和防火墙,适合对网络环境兼容性要求极高的场景。