fastcgi мультиплексирование?
Я нахожусь в процессе реализации приложения fastcgi, после прочтения спецификации fastCGI я обнаружил функцию, называемую "мультиплексирование запросов". Это напомнило мне мультиплексирование Adobe RTMP в те времена, когда протокол был закрытым и закрытым.
Насколько я понимаю, мультиплексирование позволяет сократить накладные расходы на создание новых подключений к клиентам FCGI, эффективно переплетая фрагменты запросов, и в то же время позволяя модели "поддерживать активность" для подключения. Последний позволяет отправлять несколько запросов по одному соединению.
Первый вопрос: правильно ли я понял?
Следующее - после некоторого поиска в Google я обнаружил, что нет сервера, который реализует мультиплексирование FCGI, меня сначала заинтересовали "популярные" серверы, я имею в виду nginx и lighttpd. Я даже нашел некоторое обсуждение об устаревании мультиплексирования запросов FCGI.
Таким образом, вопрос - есть ли сервер, который поддерживает эту функцию?
3 ответа
Попытка изложить ответы выше более точно (и исправить некоторые части)...
мультиплексирование позволяет сократить накладные расходы на создание новых подключений к клиентам FCGI, эффективно переплетая фрагменты запросов
В отличие от keep-alive, он значительно сокращает количество новых подключений, особенно на серверах с высокой нагрузкой или при использовании микрообслуживания (много микро-запросов). Более того, это почти необходимо в случае балансировки по сети (поэтому нельзя больше использовать unix-сокеты, и процесс создания соединения приобретает все больший приоритет).
и в то же время включение модели "keep-alive" для подключения
Хотя мультиплексирование не требуется для поддержания активности, но поддержание активности почти необходимо для мультиплексирования (иначе это не имело бы особого смысла).
Я обнаружил, что нет сервера, который реализует мультиплексирование FCGI
Есть несколько серверов, которые поддерживают мультиплексирование из коробки, но...
Я видел уже несколько модулей других разработчиков, и у меня есть собственный fcgi-модуль для nginx (в качестве замены), который поддерживает мультиплексные запросы FastCGI. Это может показать реальное увеличение производительности на практике, особенно если восходящие потоки подключены по сети. Если кому-то это нужно, я постараюсь найти время и сделать его доступным на github и т. Д.
[ из ответа выше ] Мультиплексирование FastCGI, как правило, плохая идея, потому что FastCGI не поддерживает управление потоком. Это означает: если сервер FastCGI отправляет данные, но http-клиент не может получить данные достаточно быстро, веб-сервер должен сохранить все эти данные до тех пор, пока они не будут отправлены клиенту.
Это неправда. Обычно обработчики FastCGI полностью асинхронны, пул рабочих отделен от доставляющих рабочих и т. Д. Таким образом, каждый чанк получает идентификатор запроса, поэтому, если два или более восходящих рабочих пишут одновременно в одно соединение, чанки, которые получит nginx, просто меньше. Это единственный минус. Что касается "веб-сервер должен сохранить все эти данные", он делает это в любом случае (независимо от того, используется мультиплексирование или нет), потому что в противном случае можно получить нехватку памяти, если слишком много ожидающих данных доступно для ответа. Таким образом, либо бэкэнд должен производить меньше данных (или быть сорванным), либо веб-сервер должен получать их как можно скорее и передавать их клиенту или сохранять в какое-то временное хранилище (и, например, nginx делает это, если размер ожидающих данных превышает значения, настроенные с помощью директив fastcgi_buffer_size и fastcgi_buffers).
[ из ответа выше ] При использовании мультиплексирования веб-серверу необходимо прочитать все данные из бэкэнда fastcgi, даже если один из клиентов не получает данные достаточно быстро.
Также это неверно. Веб-сервер должен считывать только один фрагмент ответа до конца, а хорошие рабочие пулы имеют "интеллектуальную" обработку, поэтому автоматически отправляет фрагменты на веб-сервер как можно скорее (то есть, если он становится доступным), поэтому если несколько провайдеров контента записывают в так называемые "отраженные" каналы одного и того же реального соединения, ожидающие пакеты будут разделены, и порции будут получены из nginx, как только будут получены данные ответа. Таким образом, почти только пропускная способность соединения имеет решающее значение, и не имеет значения, насколько быстро клиенты будут получать данные. И снова, мультиплексирование значительно экономит время на установление соединения, поэтому уменьшает количество ожидающих запросов, а также общее время выполнения запроса (скорость транзакции).
Q: мультиплексирование позволяет сократить накладные расходы на создание новых соединений с клиентами FCGI, эффективно переплетая фрагменты запросов
Правда. Но поддержание жизни также уменьшает новые связи.
Q: и в то же время включение модели "keep-alive" для подключения
A: Мультиплексирование не требуется для поддержания активности.
Q: Latter позволяет отправлять несколько запросов по одному соединению
A: keep-alive допускает несколько запросов друг за другом. Мультиплексирование позволяет выполнять несколько запросов параллельно.
Не существует широко используемого веб-сервера с поддержкой FastCGI, поддерживающего мультиплексирование. Но nginx поддерживает поддержку FastCGI.
Мультиплексирование FastCGI, как правило, плохая идея, потому что FastCGI не поддерживает управление потоком. Это означает: если сервер FastCGI отправляет данные, но http-клиент не может получить данные достаточно быстро, веб-сервер должен сохранить все эти данные до тех пор, пока они не будут отправлены клиенту.
Когда мультиплексирование не используется, веб-сервер может просто не считывать данные из бэкэнда fastcgi, если http-клиент слишком медлен, эффективно задерживая бэкэнд бэкджи. При использовании мультиплексирования веб-серверу необходимо прочитать все данные из бэкэнда fastcgi, даже если один из клиентов не получает данные достаточно быстро.
Я не знаю, реализует ли какой-либо сервер мультиплексирование FASTCGI (что, я полагаю, вы поняли правильно, но подробности приведены в спецификациях протокола FASTCTI), и я бы не стал беспокоиться.
Скорее всего, вы будете использовать FASTCGI через существующую библиотеку FASTCGI (например, Ocamlnet, если вы пишете в Ocaml и т. Д.). И эта библиотека будет выполнять мультиплексирование, если она это делает. С вашей точки зрения (этого пользователя библиотеки) вас это не должно волновать, если только вы сами не кодируете такую библиотеку.
Если вас беспокоит мультиплексирование FASTCGI, вы можете использовать протокол SCGI, который предлагает аналогичные функциональные возможности, но является более простым, немного менее эффективным и не мультиплексирующим.