问题:我需要下载带有简单XHR请求的大文件(5-10gb),以简化我至少要做的一个问题:100个请求(可能更多)。 我想使用RXJS(并行http请求)来提高性能。
问题:
堆栈:
答案 0 :(得分:1)
只有在服务器能够处理所需的并发性时才能确定
每个请求循环的1个请求都是一个接一个的顺序请求,因此与并行化不同
通常,如果您有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列表,然后在尝试第一批尝试后再次尝试,应该足够容易。同样,这取决于您的具体情况。
冗余呼叫到底是什么意思?您想看到自己没有看到什么行为?