我在我的网络应用程序中有一个非常低延迟的客户端到服务器消息传输的要求。
我看过stackoverflow上的一些帖子,说对于这个需求使用websockets比HTTP更优,但那是很久以前的事了。
今天,2018年,随着HTTP/2的进展,是否仍然值得为这种情况使用websockets呢?
我理解您希望在我的网页应用程序中实现客户端到服务器消息的低延迟传输。
HTTP/2和Websocket都可以使用二进制传输,它们传输消息的框架开销相似(仅有几个字节),但Websocket需要迭代整个消息以对有效负载进行遮罩处理,接收者则需反转此操作。参见WebSocket帧中的掩码是什么?
此外,Websocket原语更加底层,例如要创建多个消息流,必须自己完成,而在HTTP/2中则可轻松实现。请参考关于HTTP/2的播客。同时,在同一应用程序中使用Websocket和HTTP时,服务器代码会变得更加复杂。
在使用HTTP/1.1 Websocket时,流量控制可能是一个问题,但它是HTTP/2内置协议功能。
fetch
和response.body.getReader();
来高效地在HTTP/2中完成,以获取ReadableStream。有一篇关于浏览器JavaScript中流的好文章:2016 - the year of web streams。
目前在HTTP中从客户端发送消息的唯一方法是发送完整请求。 流式请求正计划但尚未被浏览器实现。请参见使用ReadableStream作为请求体的Fetch有关流式请求正文的信息。
对于浏览器作为客户端的情况,你知道web socket连接将是持久的,并且不知道任何关于HTTP连接的信息。也许你可以通过向同一服务器上的SSE端点发出虚拟请求并保持连接来强制浏览器保持连接,但这有点绕弯子。
除了连接建立外,两种协议都存在不同类型的开销(流量控制和流头与掩码),实际应用程序的影响可能只能根据实际应用程序需求进行估计。