Использовать HttpCore + HttpNIO от Apache для HTTP Pipelining на Android? - PullRequest
4 голосов
/ 20 сентября 2011

Android использует библиотеку HTTP-компонентов Apache для выполнения HTTP-запросов и предоставляет API, который не поддерживает асинхронные запросы или конвейерную обработку. Мы пишем приложение, которое выиграет от конвейерной обработки, поэтому мы используем Hotpotato для выполнения этих запросов. Чтобы уменьшить размер APK (Hotpotato и Netty добавляют ~ 2-4 МБ к размеру APK), мы стремимся реализовать свои собственные поверх HttpCore и HttpNIO.

Документация по расширениям Apache NIO содержит неясную ссылку на конвейеризацию, в которой говорится, что «неблокирующие HTTP-соединения полностью поддерживают конвейеризацию», и ошибка в HttpClient код, в котором упоминается поддержка конвейерной обработки, но нет упоминания о том, как его реализовать.

Как использовать HTTP-компоненты Apache для реализации поддержки конвейерной передачи HTTP и постоянных соединений поверх существующих библиотек HTTP-компонентов Apache Android?

1 Ответ

3 голосов
/ 25 сентября 2011

Скорее всего, вам не понравится ответ, но так и будет. Причина, по которой отсутствует поддержка конвейерной передачи HTTP, заключается в том, что конвейеризация HTTP просто бесполезна за очень ограниченным числом случаев использования. Конвейерная обработка HTTP применима (или рекомендована спецификацией HTTP) только для неидемпотентных методов HTTP. Это эффективно исключает конвейерную обработку запросов POST. Конвейерная обработка может быть незначительно полезна для браузеров, которым необходимо извлекать большие наборы статических файлов с помощью запросов GET, в то время как ограничение только двух одновременных HTTP-подключений к одному и тому же хосту. В этом случае HTTP-конвейеризация может привести к незначительным улучшениям производительности. В то же время я утверждаю, что агент HTTP, использующий пул постоянных соединений среднего размера (не более пяти), превзойдет конвейерный агент HTTP. Дополнительная сложность HTTP-конвейеризации просто не стоит проблем, и поэтому нет особой необходимости добавлять встроенную поддержку HTTP-конвейеризации в HttpClient и HttpCore.

Сказав все, что неблокирующие HTTP-соединения HttpCore NIO полностью асинхронны и всегда работают в полнодуплексном режиме. HttpCore не накладывает никаких ограничений на то, сколько запросов можно выписать или сколько ответов можно получить за один раз. Ответственность за сопоставление HTTP-запросов и ответов в логически связанных последовательностях обмена сообщениями лежит на обработчике протокола. Стандартные обработчики протокола HTTP не передают сообщения HTTP, чтобы иметь возможность поддерживать рукопожатие ожидаемого продолжения для запросов POST (проверка ожидания и конвейеризация в значительной степени взаимоисключающие). Тем не менее, нет ничего, что мешало бы вам создать собственный класс NHttpClientHandler и выполнять его конвейерные запросы. Вы можете начать, взяв исходный код HttpAsyncClientProtocolHandler [1], вырвав код подтверждения ожидания продолжения и добавив в очередь входящие и исходящие сообщения HTTP.

Надеюсь, это поможет

[1] http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/HttpAsyncClientProtocolHandler.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...