是否可以从节点将响应流式传输回浏览器,也许使用http2?
在我的网络应用程序中,用户按下一个启动服务器进程的按钮。此过程可能需要10分钟或更长时间才能完成。我想将状态更新流回客户端/浏览器。
我相信我可以用websockets做到这一点,但我希望http2有一些东西让这更容易。我知道它支持"推送"但据我所知,这只是用于推送用户将来可能需要的文件。
或许我甚至不需要http2?浏览器保持连接打开多长时间?我可以无限期地保持res.write()
吗?
答案 0 :(得分:2)
原则上,您可以使用任何HTTP版本将数据从服务器流式传输到客户端,只需在响应正文中仅发送数据片段即可。然而,当前的浏览器HTTP API(XHR和fetch)还不允许以流方式读取响应主体,而是它们将缓冲整个响应(这对于无限流没有意义)。将来,当fetch API的流媒体功能完全可用时,可以使用流式响应正文,请参阅:https://www.chromestatus.com/feature/5804334163951616您已经可以在Chrome上使用它,但据我所知,它并未完全标准化,广泛可用。
此一般规则的一个例外是服务器发送事件(SSE),它是来自浏览器的HTTP响应,遵循定义良好的转换编码(text/event-stream
)。浏览器支持SSE API以使用SSE响应,并且SSE API允许您为每个接收的数据块获取事件。 API相当简单,您不需要发明自己的分块机制,因此它可能是您的应用程序的一个很好的选择。
关于HTTP / 1.1和HTTP / 2:您将观察到的主要区别是您可以使用它们创建的并发流的数量。对于HTTP / 1.1,每个流都需要完整的TCP连接,并且浏览器限制与远程主机的连接(我想小于10)。因此,创建50个SSE流是不可能的 - 我会更进一步说,你可能只应该使用一个SSE流并将所有事件数据放入其中。另一方面,HTTP / 2允许在单个TCP连接上复用大量HTTP请求(从而也传输流体响应),这意味着拥有大量并发SSE流的问题就不那么严重了。