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

Posted

技术标签:

【中文标题】我可以使用 http2 将响应流回浏览器吗?【英文标题】:Can I stream a response back to the browser using http2? 【发布时间】:2017-07-10 02:11:48 【问题描述】:

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

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

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

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

【问题讨论】:

您可能想使用SSE。我不认为 HTTP/2 与 HTTP/1.1 在这里相关。 @kennytm 哦,这听起来很有希望。谢谢! 【参考方案1】:

原则上,您可以使用任何 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 流在那里问题不大。

【讨论】:

感谢您提供的重要信息!我刚刚尝试使用 SSE,到目前为止我已经取得了巨大的成功。甚至比我希望的还要好,我可以将进度报告发送给任何打开网页的人!无需 websocket 的实时监控。尼托!

以上是关于我可以使用 http2 将响应流回浏览器吗?的主要内容,如果未能解决你的问题,请参考以下文章

检测浏览器中的 HTTP2/SPDY 支持

http2

是否可以进行Http2跨域推送请求?

HTTP2 中的 RST_STREAM 帧

无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”

简单比较 http https http2