使用Server-Sent事件进行双向客户端 - 服务器通信(而不是WebSockets)的缺点

时间:2012-11-07 21:16:02

标签: websocket real-time server-push server-sent-events

最近,我发现Server-Sent事件是WebSockets的一个更简单的替代方案,用于从服务器进行推送。大多数比较它们的地方(如hereherehere)表示,如果您不需要客户端和服务器之间的全双工通信,那么WebSockets就太过分了,SSE就足够了。

我的问题是,当你需要双向通信(例如聊天),使用常规的ajax请求从客户端发送消息和服务器流接收它们时,使用SSE的缺点是什么?考虑到我必须在服务器端做很少的配置才能使用SSE,这似乎是一个更吸引人的选择。

2 个答案:

答案 0 :(得分:20)

SSE 优势优于WebSockets:

  • 无需更改特殊Web服务器或Web代理。
  • 定义自定义事件(否则,客户端API基本相同)
  • 更轻松地集成现有身份验证机制(OAuth,OpenID等)
与WebSockets相比,SSE 缺点

  • 单向通信通道(服务器到客户端)。客户端到服务器需要一个单独的通道。
  • 浏览器支持更受限制(没有本机IE支持,而IE 10支持WebSockets):WebSocketsSSE
  • 依靠客户端来验证来源(可能比WebSockets更容易受到XSS攻击)
  • 对二进制类型没有本机支持(WebSockets支持使用ArrayBuffers和Blob的原始帧)。
  • 即使SSE端点没有提供静态Web内容,也需要一个完整的Web服务器(独立的WebSocket服务器可以相当简单)。
  • 使用AJAX进行双向通信的SSE将比使用WebSocket连接具有更高的往返延迟和更高的客户端 - >服务器带宽。这是由于每个客户端 - >服务器AJAX请求的连接设置开销。此外,服务器 - >客户端延迟可能会出现SSE峰值,因为在许多配置中,长期连接最终将被关闭(通常每30秒一次)并需要重新打开,导致服务器 - >客户端延迟暂时出现峰值同样。

参考文献:

答案 1 :(得分:2)

与小型WebSocket消息相比,Ajax请求非常庞大。标准HTTP请求(Ajax)包括许多标头,包括每个请求的cookie,而WebSocket消息只有几个字节。

HTTP(Ajax)请求的好处是,如果这对您的问题有益,它们更容易缓存。