我可以使用 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 将响应流回浏览器吗?的主要内容,如果未能解决你的问题,请参考以下文章