使用websocket时,我们需要一个专用的双向通信连接。如果我们使用http / 2,我们有一个由服务器维护的第二个连接。
在这种情况下,使用websocket似乎会引入不必要的开销,因为使用SSE和常规http请求,我们可以通过单个HTTP / 2连接获得双向通信的优势。
您怎么看?
答案 0 :(得分:6)
在一个多路复用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是双向网络通信技术上较差的解决方案,作为一种技术,它并没有变得非常流行(没有标准API,没有书籍等 - 与WebSocket相比)。 如果从HTML5中删除它我不会感到惊讶,我不会错过它,尽管在Jetty中one of the first到implement it。
根据您感兴趣的内容,您必须根据具体情况进行基准测试或评估技术。
答案 1 :(得分:1)
从Web开发人员的角度来看,Websockets和REST接口之间的区别在于语义。 REST使用请求/响应模型,其中来自服务器的每条消息都是对来自客户端的消息的响应。另一方面,WebSockets允许服务器和客户端随时推送消息而不与先前的请求有任何关系。
使用哪种技术取决于在应用程序环境中更有意义的内容。当然,您可以使用一些技巧来模拟一种技术与另一种技术的行为,但通常最好在本书使用时更好地使用适合您的通信模型的技术。
服务器发送的事件是一项相当新的技术,但尚未得到所有主流浏览器的支持,因此它还不适用于严肃的Web应用程序。
答案 2 :(得分:1)
这很大程度上取决于您要实现的应用程序类型。如果您确实需要服务器和客户端之间的双向通信,WebSocket更合适,但您必须实现所有通信协议,并且所有IT基础架构可能都不能很好地支持它(某些防火墙,代理或负载平衡器可能不支持WebSockets) 。因此,如果您不需要100%双向链接,我建议将SSE与REST请求一起使用,以获取从客户端到服务器的其他信息。 但另一方面,SSE带有一些警告,例如在Javascript实现中,你不能覆盖标题。唯一的解决方案是传递查询参数,但是您可能会面临查询字符串大小限制的问题。 因此,在SSE和WebSockets之间进行选择实际上取决于您需要实现的应用程序类型。 几个月前,我写了一篇博文,可能会给你一些信息:http://streamdata.io/blog/push-sse-vs-websockets/。虽然当时我们没有考虑HTTP2,但这可以帮助您了解自己需要问什么问题。