当使用HTTP/2时,我们应该更喜欢使用SSE + REST还是websocket?

18
使用 Websocket 时,我们需要一条专用的双向通信连接。如果我们使用 HTTP/2,服务器会维护第二个连接。
在这种情况下,使用 Websocket 似乎会引入不必要的开销,因为使用 SSE 和常规的 HTTP 请求可以在单个 HTTP/2 连接上实现双向通信的优势。
你认为呢?
3个回答

9

使用一个多路复用的HTTP/2 TCP连接中的2个流(一个流用于服务器到客户端通信-服务器发送事件(SSE),另一个流用于客户端到服务器通信和普通HTTP通信)与使用2个TCP连接(一个用于普通HTTP通信,另一个用于WebSocket)不易比较。

可能会因应用程序而异。

开销?好吧,连接数量肯定会翻倍。不过,WebSocket可以压缩消息,而SSE不能。

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

明文WebSocket在移动网络中是否有效?根据我的经验,这取决于情况。杀毒软件、应用程序防火墙、移动运营商可能会限制WebSocket流量,或使其不太可靠,这取决于您所在的国家。

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

我认为SSE技术在双向网络通信方面相对较差,作为一项技术它并不十分流行(没有标准API、没有书籍等——与WebSocket相比)。 如果它被从HTML5中删除,我并不会感到惊讶,尽管Jetty是最早实现SSE的之一。 根据你的兴趣,你需要进行基准测试或评估该技术是否适用于你的特定情况。


11
我认为随着HTTP/2成为主要通知机制并与HTTP/2服务器推送功能相匹配,SSE将变得更加流行。每当关键资源发生更改时,服务器可以推送更改,然后发送SSE事件,以便客户端可以从其缓存中检索更改内容。对于通知使用,有效载荷大小不会太大需要进行压缩。 - Don Park

1

从网页开发者的角度来看,Websockets和REST接口之间的区别在于语义。REST使用请求/响应模型,其中服务器的每个消息都是对客户端消息的响应。另一方面,WebSockets允许服务器和客户端在任何时候推送消息,而不需要与先前的请求有任何关系。

选择使用哪种技术取决于应用程序上下文中更合理的内容。当然,您可以使用一些技巧来模拟一种技术与另一种技术的行为,但通常最好使用符合您的通信模型的那种技术。

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


1
这些技巧可以在COMET框架中使用,就像所有为性能目的而创建的历史技术一样。我的问题与性能有关,并确保我对这些技术的理解。我同意对于开发人员来说,从头开始实现它是棘手的,但这不是我的问题的目的。如果相关,则该技术应由框架隐藏。谢谢。 - Guillaume D.

1

这很大程度上取决于您想实现什么类型的应用程序。如果您确实需要服务器和客户端之间的双向通信,则WebSocket更合适,但您将不得不实现所有通信协议,并且可能不受所有IT基础设施的支持(某些防火墙、代理或负载平衡器可能不支持WebSockets)。因此,如果您不需要100%的双向链接,则建议使用SSE和REST请求从客户端到服务器获取其他信息。

但是,SSE也有一定的限制,例如在JavaScript中的实现中,您无法覆盖标头。唯一的解决方案是传递查询参数,但然后您可能会遇到查询字符串大小限制的问题。

因此,再次选择SSE和WebSockets取决于您需要实现的应用程序类型。几个月前,我写了一篇博客文章,可能会给您提供一些信息:http://streamdata.io/blog/push-sse-vs-websockets/。尽管当时我们没有考虑HTTP2,但这可以帮助您了解需要问自己的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接