Придержите дверь
Протокол HTTP, начиная с версии 1.1, создает постоянное соединение (HTTP keep-alive) для нескольких запросов на один и тот же хост. Это позволяет снизить загрузку процессора и расход памяти, так как открывается меньше соединений одновременно. При HTTPS-соединениях разница более заметна, так как создание защищенного соединения требует больших ресурсов и дополнительного сетевого обмена между клиентом и сервером.
Многие разработчики, которые не учитывают или не знают этой информации, в итоге обнаруживают, что их приложение работает медленней, чем они ожидали.
Давайте рассмотрим эту проблему на примере следующей задачи: получить с помощью API GitHub все репозитории GeoIP вместе с их релизами. Одним запросом это сделать нельзя: сначала нужно получить список репозиториев, а затем для каждого запросить релизы.
Рассмотрим решение двумя способами. На первый взгляд разницы между ними нет, но если мы выполним скрипты, то получим совершенно разные результаты.
Что же не так? В первом случае между сервером и клиентом создается одно соединение для всех запросов, во втором случае — каждый раз создается новый объект клиента, и, соответственно, для каждого запроса создается новое соединение, что приводит к потерям во времени.
Также можно представить следующую ситуацию — на сайте при определенных действиях пользователей происходит обращение к API какого-либо сервиса. В таком случае при запросе на ваш сервер происходит обращение на другой сервер согласно API сервиса, и для каждого такого запроса расходуются ресурсы на создание соединения. В высоконагруженных системах это может привести к существенным потерям в ресурсах и скорости работы.
Исправить это можно, например, переложив работу по созданию внешних запросов на специального демона, который сможет пользоваться возможностями keep-alive и поддерживать набор постоянных соединений.
Post #29
2.81K