RXJS的并行请求是否会更好地提高性能?

时间:2019-05-22 16:06:12

标签: angular performance rxjs

问题:我需要下载带有简单XHR请求的大文件(5-10gb),以简化我至少要做的一个问题:100个请求(可能更多)。 我想使用RXJS(并行http请求)来提高性能。

问题:

  1. 使用Parallel可以改善性能吗?
  2. 并行化请求是否与在每次请求循环迭代中使用1个请求不同?带宽是一样的-不可以吗?
  3. 还有其他方法可以改善我的表现吗?

堆栈:

  • 角度7.2.x
  • 打字稿3.2.4
  • Rxjs 6.4.0

4 个答案:

答案 0 :(得分:1)

  1. 只有在服务器能够处理所需的并发性时才能确定

  2. 每个请求循环的1个请求都是一个接一个的顺序请求,因此与并行化不同

  3. 通常,如果您有100个请求,我们会将并发限制为数字服务器不会因过多的请求而挂起,请在下面的代码中进行演示

     const urls=[url1,url2,url3]
     const concurrency=5
     const fetchUrls=urls.map(url=>defer(_=>fetch(url)))
     merge(...fetchUrls,concurrency).subscribe(console.log)

答案 1 :(得分:0)

并行化请求是否与在请求循环的每次迭代中使用1个请求不同?带宽相同-否

=>我会说“否”,因为在服务器上,当一个线程正在执行第一个请求时,第二个踏板可以下载第二个请求 =>对我来说,最好并行化,但是也许我错了

答案 2 :(得分:0)

您可以使用RXJS'merge'运算符: 假设getData(url)是发出请求的方法,并且该方法返回一个Observable,则可以执行以下操作:

const urls: string[] = {url1, url2, url3,...};
let mergeHttpCallObservalbe: Observable<any>;
urls.forEach((url: string) => {
  const newHttpCallObservalbe : Observable<any> = myService.getData(url);
  if (mergeHttpCallObservalbe){
    mergeHttpCallObservalbe = merge(mergeHttpCallObservalbe, newHttpCallObservalbe);
  } else {
    mergeHttpCallObservalbe = newHttpCallObservalbe;
  }
});

// Now you have merged all your Observable, you can subscribe:
mergeHttpCallObservalbe.subscribe(result => {
  // Do your stuff...
});

关于Rxjs运算符,这里有一篇不错的文章:https://blog.angularindepth.com/learn-to-combine-rxjs-sequences-with-super-intuitive-interactive-diagrams-20fce8e6511

希望这会有所帮助

答案 3 :(得分:0)

简短的回答是,是的,并行性应该在一定程度上改善问题。

快速浏览“浏览器请求限制”的Google会弹出following,这表明您可以根据域使用不同的浏览器,在每个域中发出2到13个并发请求。只要用户的互联网连接没有达到饱和,并且您还没有达到该限制,您确实应该能够同时发出并等待请求。这将比每次发出一个请求更快,因为浏览器在等待下一个请求时实际上并不需要做任何工作。

带宽确实是相同的,但是吞吐量更高。

什么会提高性能取决于您的特定情况,但是我想发出100个小请求实际上要比发出单个大请求慢,因为每个小请求必须先完成单独的握手才能开始接收数据。

就RxJ而言,我喜欢Fan Cheung's answer,但我看到您有一个重试机制,而他们的回答却不行。将重试添加到每个“提取”调用中或保留失败的URL列表,然后在尝试第一批尝试后再次尝试,应该足够容易。同样,这取决于您的具体情况。

冗余呼叫到底是什么意思?您想看到自己没有看到什么行为?