【问题标题】:Should we prefer SSE + REST over websocket when using HTTP/2?使用 HTTP/2 时,我们是否应该更喜欢 SSE + REST 而不是 websocket?
【发布时间】:2015-09-08 14:58:30
【问题描述】:

当使用 websocket 时,我们需要一个专用连接来进行双向通信。如果我们使用 http/2,我们有第二个由服务器维护的连接。

在这种情况下,使用 websocket 似乎会引入不必要的开销,因为使用 SSE 和常规 http 请求,我们可以通过单个 HTTP/2 连接获得双向通信的优势。

你怎么看?

【问题讨论】:

    标签: websocket server-sent-events http2


    【解决方案1】:

    在一个多路复用 HTTP/2 TCP 连接中使用 2 个流(一个流用于服务器到客户端通信 - Server Sent Events (SSE),一个流用于客户端到服务器通信和正常 HTTP 通信)与使用 2 TCP 连接(一个用于普通 HTTP 通信,一个用于 WebSocket)不容易比较。

    可能里程会因应用而异。

    开销?好吧,当然连接数翻了一番。 但是,WebSocket 可以压缩消息,而 SSE 不能。

    灵活性?如果连接是分开的,它们可以使用不同的加密。 HTTP/2 通常需要非常强大的加密,这可能会限制性能。 另一方面,WebSocket 不需要 TLS。

    明文 WebSocket 是否在移动网络中工作?根据我的经验,这取决于。防病毒软件、应用程序防火墙、移动运营商可能会限制 WebSocket 流量,或降低其可靠性,具体取决于您所在的国家/地区。

    API 可用性? WebSocket 是一个更广泛部署和认可的标准;例如,在 Java 中有一个官方 API (javax.websocket),另一个即将推出 (java.net.websocket)。

    我认为 SSE 在技术上是一种用于双向 Web 通信的劣质解决方案,并且作为一项技术,它并没有变得非常流行(与 WebSocket 相比,没有标准的 API、没有书籍等)。 如果它从 HTML5 中删除,我不会感到惊讶,我也不会错过它,尽管在 Jetty 中是 one of the firstimplement it

    根据您的兴趣,您必须针对特定情况进行基准测试或评估技术。

    【讨论】:

    • 我认为 SSE 将通过 HTTP/2 作为与 HTTP/2 服务器推送功能完美搭配的主要通知机制而变得更加流行。每当关键资源发生更改时,服务器可以推送更改然后发送 SSE 事件,以便客户端可以从其缓存中检索更改。对于通知使用,有效负载大小不会大到需要压缩。
    【解决方案2】:

    从 Web 开发人员的角度来看,Websockets 和 REST 接口之间的区别在于语义。 REST 使用请求/响应模型,其中来自服务器的每条消息都是对来自客户端的消息的响应。另一方面,WebSockets 允许服务器和客户端在任何时候推送消息,而与之前的请求无关。

    使用哪种技术取决于在您的应用程序上下文中更有意义的技术。当然,您可以使用一些技巧来模拟一种技术与另一种技术的行为,但通常最好使用最适合您的通信模型的一种技术。

    服务器发送事件是一项相当新的技术,尚未得到所有主流浏览器的支持,因此它还不是一个严肃的网络应用程序的选择。

    【讨论】:

    • 这些技巧可以在 COMET 框架中,就像所有为性能目的而创建的历史技术一样。我的问题与性能有关,并确保我对这些技术的理解。我同意开发人员从头开始实现它很棘手,但这不是我问题的目的。如果相关,该技术应该被框架隐藏。谢谢。
    【解决方案3】:

    这在很大程度上取决于您要实现什么样的应用程序。如果您确实需要服务器和客户端之间的双向通信,则 WebSocket 更合适,但您必须实现所有通信协议,并且可能无法得到所有 IT 基础设施的良好支持(某些防火墙、代理或负载平衡器可能不支持 WebSockets) .因此,如果您不需要 100% 的双向链接,我建议您将 SSE 与 REST 请求一起使用,以获取从客户端到服务器的更多信息。 但另一方面,SSE 带有某些警告,例如在 Javascript 实现中,您不能覆盖标头。唯一的解决方案是传递查询参数,但是您可能会遇到查询字符串大小限制的问题。 因此,再次强调,在 SSE 和 WebSockets 之间进行选择实际上取决于您需要实现的应用程序类型。 几个月前,我写了一篇博文,可能会给你一些信息:http://streamdata.io/blog/push-sse-vs-websockets/。虽然当时我们没有考虑 HTTP2,但这可以帮助你知道你需要问自己什么问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2010-12-30
      • 2018-01-22
      • 2011-04-01
      • 2022-01-08
      • 2010-09-13
      相关资源
      最近更新 更多