Почему мои остатки не выдаются параллельно через HTTP2?

#angular #google-chrome #http2

#угловой #google-chrome #http2

Вопрос:

У меня есть угловой веб-сайт, который должен отправлять запросы на отдых в серверную часть. Чтобы быстрее получать необходимые данные, я хочу использовать протокол HTTP/2, который позволяет выполнять несколько параллельных запросов по одному соединению.

Это мой код Angular 11 (машинописный текст), отправляющий 40 запросов в цикле:

 const observables: Observablelt;RecordingStepScreenshotgt;[] = [];  const endpoint = ...;  for (let i = 0; i lt; 40; i  ) {  observables.push(this.http.getlt;RecordingStepScreenshotgt;(endpoint)); }  forkJoin(observables).subscribe((result) =gt; {  console.log('execution of all calls has been finished'); });  

В приведенном выше фрагменте я параллельно выдаю 40 HTTP-запросов «get». Я использую «forkJoin», чтобы дождаться завершения всех наблюдаемых.

Я ожидал, что все они будут выпущены и завершены примерно в одно и то же время (параллельно). Однако в браузере (Chrome 96) Я вижу, что запросы выдаются один за другим, как бы водопадом:

введите описание изображения здесь

Чего мне не хватает?

Комментарии:

1. Браузеры имеют максимальное количество запросов, которые они будут выполнять одновременно…

2. @Carsten это правильно, но актуально только для HTTP 1. Я видел своими глазами несколько лет назад, как несколько (десятков) статических ресурсов загружались параллельно по http 2. Однако в то время я не пытался выполнять вызовы Ajax. Кроме того, даже через браузер http1 можно выдавать большие объемы из 6-8 запросов, но здесь я вижу только один за раз

Ответ №1:

На случай, если кто-нибудь сочтет это полезным:

Как я обнаружил в другом ответе SO, когда Chrome видит несколько запросов к одному и тому же месту назначения (это то, что я сделал в своем примере), он ожидает завершения предыдущего запроса, чтобы сохранить следующие вызовы. Это поведение можно изменить, отключив кэш (заголовок хранилища без кэша). При отправке нескольких запросов в разные пункты назначения все запросы выполняются параллельно, как и ожидалось.

Комментарии:

1. Я также сталкиваюсь с той же проблемой в angular 8/12. Я использовал forkjoin для параллельного вызова 3 api. Но все равно звонки идут последовательно и ждут завершения других. постоянные наблюдаемые: любые[] = []; наблюдаемые.push(это.leaderboardAgentDetailsService.getRewardsPoints().труба(ошибка(e =gt; из(«)))); наблюдаемые.push(это.leaderboardAgentDetailsService.getPursuitsLevel().труба(ошибка(e =gt;gt; из(ошибка)))); наблюдаемые.push(это.leaderboardAgentDetailsService.getTrivia().pipe(ошибка(e = gt; gt; gt; (ошибка)))); forkJoin(наблюдаемые).подписаться( (соотв.: любой) =gt;gt;gt;gt; {

2. Что я увидел, так это то, что после установки заголовков все вызовы не работают параллельно. Как только удалите заголовки запросов, затем работайте правильно