在上一篇文章中,我正在研究来自服务器的流数据。 通过流式传输,我知道可以尽快返回数据,而不会引起任何其他延迟。 我分析并实现了三种方法:
- 以纯列表形式返回数据,而不进行流式处理。 用作性能比较的基准
- 使用服务器发送的事件通过流返回数据
- 利用Jackson流返回数据
从消费者的角度来看, 返回简单列表和使用Jackson进行流式传输是等效的。 在这两种方法中,我们都使用ajax请求数据并类似地处理响应。 唯一的区别是延迟,即我们收到特定信息的时间。 对于列表,我们期望在后端处理结束时获得巨大的负载。 由于其增量性质,流可以更快地传送数据的第一个字节。
- 流媒体不会杀死Cinema,这就是为什么
- 第6天:使用Spark流和Scala进行实时推文分析
- 体育广播潜在的构造转变的第一个迹象。
- Spotify Premium与Apple Music现在
- 使用SoundCloud Clone拓展您的娱乐业务
在本文中,我将向您展示如何实现增量流传输以更早显示第一个字节,并改善使用慢速移动网络(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。