Каковы недостатки использования HTTP-конвейеризации?
Сессия WWDC 2012. 706 - Рекомендации по работе с сетями объясняют конвейеризацию HTTP.
- По умолчанию это отключено на iOS
- В своем выступлении он описал это как огромный выигрыш в производительности.
Почему вы не хотите его использовать?
1 ответ
Ошибки реализации
Чтобы конвейер работал, ответы должны возвращаться в том порядке, в котором они были запрошены. Реализация простого сервера может просто отправить ответ, как только он будет рассчитан. Если несколько запросов отправляются параллельно, и первый запрос обрабатывается дольше (например, обработка большего изображения), то ответы будут не в порядке.
Это проблема для клиента, так как HTTP является протоколом без сохранения состояния, у клиента нет способа сопоставить запросы с ответами. Это зависит от порядка возврата ответов.
Сервер ДОЛЖЕН отправить свои ответы на эти запросы в том же порядке, в котором они были получены.
- Safari, по-видимому, использовал HTTP-конвейеризацию для изображений, по крайней мере. Это приводит к проблеме, где изображения будут обмениваться.
- В AFNetworking использовался конвейерный конвейер, но он был удален после сообщенной проблемы.
- Все основные браузеры (кроме Opera) имеют HTTP-конвейеризацию, отключена или не реализована.
Проблемы с производительностью
Даже если сервер правильно поддерживает конвейерную обработку, могут возникнуть проблемы с производительностью, поскольку все последующие запросы должны ждать завершения первого (блокировка заголовка строки).
В этой статье рассказывается о потере производительности при некоторых обстоятельствах и возможности атаки типа "отказ в обслуживании".
Эта статья также предполагает, что конвейерная обработка не является огромной победой.
WWDC 2015 - Сеть с NSURLSession действительно хорошо объясняет главу блокировки линии. (Решение состоит в том, чтобы перейти на HTTP 2, который поддерживает приоритеты)
Итак, в итоге проблемы с конвейерной передачей HTTP:
- Некоторые серверы и большинство прокси не поддерживают это. (Возможно, из-за проблем безопасности / надежности / или производительности)
- Некоторые серверы поддерживают его неправильно, и это может привести к ошибкам клиента.
- Это не обязательно выигрыш в производительности.
- Восприимчив к блокировке линии