首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用RXJS的并行请求会对性能有更好的影响吗?

使用RXJS的并行请求会对性能有更好的影响吗?
EN

Stack Overflow用户
提问于 2019-05-23 00:06:12
回答 4查看 605关注 0票数 2

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

问题:

  1. 有没有可能通过并行来提高性能?
  2. 并行化请求不会等同于对请求循环的每次迭代使用一个请求?带宽是一样的-不是吗?
  3. 有没有其他方法来提高我的性能?

堆栈:

  • Angular 7.2.x
  • Typescript 3.2.4
  • Rxjs 6.4.0

我真正想要的是:我真正需要的是在mergeMap上应用同步来触发它的开/关。例如,我有100个one,但我不希望它们运行到最后一个。

例如,我希望它运行到17日,但会暂停发出请求,并等待特定的逻辑和请求完成。

代码示例:

from(observableQueries)
           .pipe(
               mergeMap(partialQuery => this.messageService.getResults(partialQuery, true), 4),
               takeWhile(o => {
                   if (!o.isMoreResults && o.auditMessageList.length === 0) {
                       this.logger.log(`First page that returns false ${ o.number }`);
                       this.logger.log(`Count of responses that exists in array: ${ allResults.length }`);
                       if (!firstPageThatShouldBeStopped) {
                           firstPageThatShouldBeStopped = o.number;
                       }

                       if (allResults.length === firstPageThatShouldBeStopped) {
                           return false;
                       }
                   }
                   return true;
               }),
               retryWhen(genericRetryStrategy()),
               catchError((err, caught) => {
                   this._alertService.error(this._translate.instant('EXPORT_TO_CSV_DOWNLOAD_ERROR'));
                   return throwError(err);
               })
           )
           .subscribe(
               (res: MessagesResult) => {
                   if (reThrowError) {
                       this.logger.info('Error will be thrown for e2e purposes');
                       throw new Error('Error will throw for e2e purposes');
                   }
                   if (res.isMoreResults && res.auditMessageList.length > 0) {
                       allResults[res.number] = res;
                       this.subject.next(true);
                   } else if (!res.isMoreResults && res.auditMessageList.length > 0) {
                       allResults[res.number] = res;
                       this.subject.next(true);
                   } else {
                       this.subject.next(false);
                   }
               },
               err => {
                   // clear subject after emitting value...
                   this.subject.next(true);
                   return this.handleError(err);
               },
               () => {
                   this.logger.info('Download file finished...');
                   this.logger.info('Time consumed: ', performance.now() - start);
                   try {
                       this.logger.info(`Count Responses: ${ allResults.length } `);
                       const allResultSorted = this._sortResults(allResults);
                       let counter = 0;
                       for (let i = 0; i < allResultSorted.length; i++) {
                           this.logger.info('Index: ' + i, allResultSorted[i]);
                           counter += allResultSorted[i].auditMessageList.length;
                           this.logger.info('Length OF Messages: ' + i, counter);
                           this.fileSaver.save(!allResultSorted[i].isMoreResults, allResultSorted[i].auditMessageList,
                               `audit-events_${ LOCAL_QUERY_COPY.application }_${ timestamp }_${ moment()
                                   .tz(this._timezoneService.timezone).zoneName() }.csv`, null, headers);
                       }
                       this.subject.next(false);
                   } catch (e) {
                       this._alertService.error(this._translate.instant('EXPORT_TO_CSV_DOWNLOAD_ERROR'));
                       return this.handleError(e);
                   } finally {
                       // clear subject after emitting value...
                       this.subject.next(true);
                   }
               }
           );

代码起作用了!但问题出在冗余呼叫上。如何才能让em停止,直到最后一个请求运行完毕。

EN

回答 4

Stack Overflow用户

发布于 2019-06-12 10:42:12

  1. 可以肯定的是,只有当您的服务器能够处理所需的并发请求时,请求循环的每一次迭代都是
  2. 1请求-循环是一个接一个的顺序请求,因此它与parallelizing
  3. Normally不同如果您有100个请求,我们将把并发限制为一个数字服务器不会挂起过多的请求,请参见下面的代码

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

票数 1
EN

Stack Overflow用户

发布于 2019-05-23 03:48:33

将请求并行化与对请求循环的每个迭代使用一个请求不是相同的吗?带宽是一样的-不

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

票数 0
EN

Stack Overflow用户

发布于 2019-05-28 00:39:22

您可以使用RXJS 'merge‘操作符:假设getData(url)是发出请求的方法,并且此方法返回一个可观察对象,您可以这样做:

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

希望能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56260967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档