在AngularJS中流式传输HTTP响应

在上一篇文章中,我正在研究来自服务器的数据。 通过流式传输,我知道可以尽快返回数据,而不会引起任何其他延迟。 我分析并实现了三种方法:

  • 以纯列表形式返回数据,而不进行流式处理。 用作性能比较的基准
  • 使用服务器发送的事件通过流返回数据
  • 利用Jackson流返回数据

从消费者的角度来看, 返回简单列表使用Jackson进行流式传输是等效的。 在这两种方法中,我们都使用ajax请求数据并类似地处理响应。 唯一的区别是延迟,即我们收到特定信息的时间。 对于列表,我们期望在后端处理结束时获得巨大的负载。 由于其增量性质,流可以更快地传送数据的第一个字节。

在本文中,我将向您展示如何实现增量流传输以更早显示第一个字节,并改善使用慢速移动网络(3G的快速变体)的人们的用户体验。

为此,我将实现两个http客户端:

  • HttpClient利用角度$ http服务在浏览器完全读取和解析数据后立即提供数据
  • StreamingHttpClient使用Oboe.js返回json响应的特定节点,而无需等待响应的最后字节。

使用这些客户端,我将评估在有无网络节流的情况下获取5 000行数据的性能和感知的用户体验。 开始吧! 第一部分– HttpClient!


AngularJS具有内置的http客户端,但我对此并不满意。 它经历了从成功和错误回调到基于Promise的api的旅程。 纯承诺不提供任何取消支持,因此$ http所有者诉诸于在配置对象中传递附加参数。 此参数称为超时,它还揭示了它的第二个性质-控制请求的时间。 至少可以说,这不是一个优雅的解决方案。

我更喜欢RxJS api,因为它非常强大,而且在许多情况下,它是您唯一需要的api。 将它用于http并不是什么新颖的事情,Angular 2可以做到这一点,因此我最终决定将$ http服务与Observable接口包装在一起。 稍后这将特别有用,因为在StreamingHttpClient中,当我们要发出多个值时,基于诺言的api毫无意义。

这是HttpClient的源代码:

StreamingHttpClient

流式传输能够更早地传递第一行,大约1.7秒后,我们可以分析屏幕上的第一行数据。 总使用资源高于HttpClient中的资源但这可以更快地渲染并以6.4 [s]更快地完成处理。

HttpClient

现在,没有网络限制的情况大不相同。 不再闲置,仅是纯渲染和脚本编写。 所有操作均在1.4秒完成,这是在屏幕上最早看到所有结果所需的时间!

StreamingHttpClient

在受限制的网络中,由于网络延迟,更快的流传输更为简单。 如果我们删除几乎所有内容,该怎么办?

我想说流媒体仍然要快得多。 第一行显示为0.6 [s],尽管最新显示为1.5 [s],比HttpClient差100 [ms] ,但我很难相信真正的人类会等待最后一行在分析其中的前5k之前出现。

总而言之,串流确实值得!

今天就这些。 谢谢阅读! 寻找下一篇文章!


这篇文章中使用的所有资源都可以在我的Github存储库中找到https://github.com/bartekbp/blog/tree/master/data-streaming/frontend。