【问题标题】:Why my RESTs not issued in parallel over HTTP2?为什么我的 REST 没有通过 HTTP2 并行发布?
【发布时间】:2022-01-06 08:53:32
【问题描述】:

我有一个 Angular 网站,它需要向后端发送 REST 请求。为了更快地获取所需数据,我想利用 HTTP/2 协议,该协议允许通过单个连接进行多个并行请求。

这是我的 Angular 11 代码(打字稿),循环发送 40 个请求:

const observables: Observable<RecordingStepScreenshot>[] = [];

const endpoint = ...;

for (let i = 0; i < 40; i++) {
    observables.push(this.http.get<RecordingStepScreenshot>(endpoint));
}

forkJoin(observables).subscribe((result) => {
    console.log('execution of all calls has been finished');
});

在上面的片段中,我并行发出 40 个 HTTP“get”请求。我使用“forkJoin”来等待所有可观察对象的完成。

我预计所有这些都将在大约同一时间(并行)发布和完成。 但是,在浏览器(Chrome 96)中,我看到请求一个接一个地以瀑布方式发出:

我错过了什么?

【问题讨论】:

  • 浏览器有最大数量的请求,它们将同时运行...
  • @Carsten 这是正确的,但仅与 HTTP 1 相关。几年前,我在我眼中看到多个(数十个)静态资源是如何通过 http 2 并行下载的。但是,我没有尝试过是时候发出 Ajax 调用了。此外,即使通过 http1 浏览器也能够发出大量 6-8 个请求,但在这里我一次只能看到一个

标签: angular google-chrome http2


【解决方案1】:

如果有人觉得它有用:

正如我在其他一些 SO 答案中发现的那样,当 Chrome 看到对同一目的地的多个请求时(这是我在示例中所做的) - 它等待上一个请求完成以保存下一个调用。可以通过禁用缓存(缓存无存储标头)来更改此行为。向不同目的地发送多个请求会按预期并行发出所有请求。

【讨论】:

  • 我在 Angular 8/12 中也面临同样的问题。我已经使用 forkjoin 并行调用 3 个 api。但是呼叫仍然按顺序进行并等待其他人完成。常量观察:任何[] = []; observables.push(this.leaderboardAgentDetailsS​​ervice.getRewardsPoints().pipe(catchError(e => of('')))); observables.push(this.leaderboardAgentDetailsS​​ervice.getPursuitsLevel().pipe(catchError(e => of(error)))); observables.push(this.leaderboardAgentDetailsS​​ervice.getTrivia().pipe(catchError(e => of(error)))); forkJoin(observables).subscribe( (resp: any) => {
  • 我看到的是在设置标题后所有调用都不能并行工作。一旦删除请求标头,然后正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多