我可以使用 http2 将响应流式传输回浏览器吗?

2024-03-09

是否可以使用 http2 将响应从节点流式传输回浏览器?

在我的网络应用程序中,用户按下一个按钮来启动服务器进程。此过程可能需要 10 分钟或更长时间才能完成。我想将状态更新流回客户端/浏览器。

我相信我可以使用 websockets 做到这一点,但我希望 http2 有一些东西可以让这变得更容易。我知道它支持“推送”,但据我所知,这仅用于推送用户将来可能需要的文件。

或者也许我什至不需要http2?浏览器将保持连接打开多长时间?我可以保留吗res.write()无限期地这样做?


原则上,您可以使用任何 HTTP 版本将数据从服务器流式传输到客户端,只需发送响应正文中的数据片段即可。然而,当前的浏览器 HTTP API(XHR 和 fetch)尚不允许以流式传输方式读取响应正文,相反,它们将缓冲整个响应(这对于无限流没有意义)。当 fetch API 的流式传输功能完全可用时,将来可以使用流式响应正文,请参阅:https://www.chromestatus.com/feature/5804334163951616 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 流不再是一个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用 http2 将响应流式传输回浏览器吗? 的相关文章

随机推荐