【发布时间】:2015-09-08 14:58:30
【问题描述】:
当使用 websocket 时,我们需要一个专用连接来进行双向通信。如果我们使用 http/2,我们有第二个由服务器维护的连接。
在这种情况下,使用 websocket 似乎会引入不必要的开销,因为使用 SSE 和常规 http 请求,我们可以通过单个 HTTP/2 连接获得双向通信的优势。
你怎么看?
【问题讨论】:
标签: websocket server-sent-events http2
当使用 websocket 时,我们需要一个专用连接来进行双向通信。如果我们使用 http/2,我们有第二个由服务器维护的连接。
在这种情况下,使用 websocket 似乎会引入不必要的开销,因为使用 SSE 和常规 http 请求,我们可以通过单个 HTTP/2 连接获得双向通信的优势。
你怎么看?
【问题讨论】:
标签: websocket server-sent-events http2
在一个多路复用 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 first 到 implement it。
根据您的兴趣,您必须针对特定情况进行基准测试或评估技术。
【讨论】:
从 Web 开发人员的角度来看,Websockets 和 REST 接口之间的区别在于语义。 REST 使用请求/响应模型,其中来自服务器的每条消息都是对来自客户端的消息的响应。另一方面,WebSockets 允许服务器和客户端在任何时候推送消息,而与之前的请求无关。
使用哪种技术取决于在您的应用程序上下文中更有意义的技术。当然,您可以使用一些技巧来模拟一种技术与另一种技术的行为,但通常最好使用最适合您的通信模型的一种技术。
服务器发送事件是一项相当新的技术,尚未得到所有主流浏览器的支持,因此它还不是一个严肃的网络应用程序的选择。
【讨论】:
这在很大程度上取决于您要实现什么样的应用程序。如果您确实需要服务器和客户端之间的双向通信,则 WebSocket 更合适,但您必须实现所有通信协议,并且可能无法得到所有 IT 基础设施的良好支持(某些防火墙、代理或负载平衡器可能不支持 WebSockets) .因此,如果您不需要 100% 的双向链接,我建议您将 SSE 与 REST 请求一起使用,以获取从客户端到服务器的更多信息。 但另一方面,SSE 带有某些警告,例如在 Javascript 实现中,您不能覆盖标头。唯一的解决方案是传递查询参数,但是您可能会遇到查询字符串大小限制的问题。 因此,再次强调,在 SSE 和 WebSockets 之间进行选择实际上取决于您需要实现的应用程序类型。 几个月前,我写了一篇博文,可能会给你一些信息:http://streamdata.io/blog/push-sse-vs-websockets/。虽然当时我们没有考虑 HTTP2,但这可以帮助你知道你需要问自己什么问题。
【讨论】: