Запросы Chrome CORS быстрее, когда кеш отключен? - PullRequest
0 голосов
/ 16 сентября 2018

Мое приложение загружает видео здесь: https://core.arc.io/guanzo/VideoOfPeopleWalking.mp4

Оно загружает видео из другого источника кусками по 16 КБ, используя заголовок запроса Range.Мой сервер установил заголовок ответа Access-Control-Max-Age равным 10 минутам для предотвращения избыточных запросов OPTIONS.

Перейдите по ссылке (это страница HTML), откройте сетевые инструменты и обратите внимание, что для извлечения фрагмента размером 16 КБ требуется около 1 с.

Теперь установите флажок «Отключить кэш», и вам следуетПосмотрите, как запросы заканчивают ОЧЕНЬ быстрее, и похоже, что есть больше одновременных запросов.Это противоположно ожидаемому поведению, поскольку каждый запрос должен запускаться и ждать запроса OPTIONS.

Если кэш включен, запросы должны выполняться быстрее, нет?Что здесь происходит?

Вот репродукция в формате GIF: https://i.gyazo.com/ec5941829031cdd4dc684a3b53ec6c39.mp4

ПРИМЕЧАНИЕ. Чанки хранятся в IndexedDB, поэтому, если вы обновите страницу, вам необходимо очистить IndexedDBзаставить все запросы сработать.

РЕДАКТИРОВАТЬ: отфильтровать любые запросы пожарного хранилища, я не уверен, почему они запускаются, но это не должно быть связано с моим вопросом.

РЕДАКТИРОВАТЬ: новыйПодсказка!https://i.gyazo.com/bd887533a42868f748564ccda4451881.png

Если установлен флажок «Отключить кэш», Chrome будет повторно использовать то же TCP-соединение, что и в столбце «Идентификатор соединения».Якобы, это должно делать запросы быстрее.

1 Ответ

0 голосов
/ 17 сентября 2018

Делая глубокие вдохи , высунув голову из отладочной кроличьей норы.

Эта проблема имеет много решений.

Проблема:

Chrome считает, что каждый запрос диапазона запрашивает «один и тот же» ресурс, поскольку URL-адрес совпадает Технически это НЕ "тот же" ресурс, потому что запрашивается другой диапазон байтов, как указано в заголовке Content-Range.

Вот цитата из chromium docs о том, как кеш http обрабатывает запросы с одинаковым URL.

Принудительная блокировка кеша.

В кеше реализована одна запись - блокировка нескольких читателей, так что только один сетевой запрос на тот же ресурс находится в полете в любой данное время.

Обратите внимание, что наличие блокировки кеша означает, что полоса пропускания не впустую повторное извлечение одного и того же ресурса одновременно. С другой стороны, он заставляет запросы ждать до завершения предыдущего запроса загрузка ресурса ...

Если вы откроете вкладку «Синхронизация» в каждом сетевом запросе в моем примере, вы увидите, что каждый запрос ожидал завершения предыдущего запроса.

Решение:

Принудительно заставляет Chrome распознавать, что запросы диапазона возвращают разные ресурсы.

Это можно сделать, установив заголовок Cache-Control: no-cache, no-store в запросе или ответе. Улучшение производительности было наивысшим при настройке по запросу. Другие значения заголовка, вероятно, будут работать, я только протестировал no-cache, no-store. Это объясняет, почему проверка «Отключить кеш» сделала мои запросы намного быстрее, каждый запрос мог использовать другое TCP-соединение и не блокировался блокировкой кеша.

Я бы хотел поддержать этот ТАК за то, что дал мне "Ага!" момент, и к Firefox за отсутствие этой проблемы.

...