Любые HTTP-прокси с явной настраиваемой поддержкой буферизации запросов/ответов и отложенных соединений?

При работе с мобильными клиентами очень часто возникают многосекундные задержки при передаче HTTP-запросов. Если вы обслуживаете страницы или службы из предварительно разветвленного Apache, дочерние процессы будут привязаны на несколько секунд к обслуживанию одного мобильного клиента, даже если логика вашего сервера приложений выполняется за 5 мс. Я ищу HTTP-сервер, балансировщик или прокси-сервер, который поддерживает следующее:

  1. Приходит запрос на прокси. Прокси начинает буферизовать в ОЗУ или на диске запрос, включая заголовки и тела POST/PUT. Прокси НЕ открывает соединение с внутренним сервером. Это, пожалуй, самая важная часть.

  2. Прокси-сервер прекращает буферизацию запроса, когда:

    • A size limit has been reached (say, 4KB), or
    • Запрос получен полностью, заголовки и тело
  3. Только теперь, когда (часть) запроса находится в памяти, открывается соединение с серверной частью, и запрос ретранслируется.

  4. Серверная часть отправляет ответ. Опять же, прокси-сервер начинает немедленно буферизировать его (до более щедрого размера, скажем, 64 КБ).

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

  6. Прокси-сервер отправляет ответ мобильному клиенту настолько быстро или медленно, насколько это возможно, без подключения к бэкэнду, который связывает ресурсы.

Я почти уверен, что вы можете сделать 4-6 со Squid, а nginx, кажется, поддерживает 1-3 (и выглядит довольно уникальным в этом отношении). Мой вопрос: есть ли какой-либо прокси-сервер, который сопереживает этим возможностям буферизации и не-открытия-соединений до готовности? Может быть, есть просто немного конфигурации Apache, которая делает это поведение буферизации тривиальным? Кто-нибудь из них говорил, что это не динозавр, как Squid, и что он поддерживает бережливую однопроцессную, асинхронную модель выполнения, основанную на событиях?

(Сайдерант: я бы использовал nginx, но он не поддерживает фрагментированные тела POST, что делает его бесполезным для обслуживания мобильных клиентов. Да, дешевые 50-долларовые телефоны любят фрагментированные POST... вздох)


person Carlos Carrasco    schedule 18.09.2008    source источник


Ответы (5)


Как насчет использования и nginx, и Squid (клиент — Squid — nginx — серверная часть)? Когда возвращает данные из серверной части, Squid преобразует их из C-T-E: chunked в обычный поток с установленным значением Content-Length, поэтому, возможно, он также может нормализовать POST.

person Roman Odaisky    schedule 24.09.2008
comment
Похоже, это единственный способ сделать это без разработки специального решения, я не знал, что Squid преобразовал тело, разбитое на куски, в запрос 1.0. Спасибо за внимание! - person Carlos Carrasco; 01.10.2008

Nginx может делать все, что вы хотите. Параметры конфигурации, которые вы ищете,

http://wiki.codemongers.com/NginxHttpCoreModule#client_body_buffer_size

а также

http://wiki.codemongers.com/NginxHttpProxyModule#proxy_buffer_size

person Dave Cheney    schedule 01.10.2008
comment
Nginx не поддерживает фрагментированные тела POST, которые многие мобильные клиенты Java ME принудительно отправляют. Я уже использую nginx на сайтах, которые в основном обслуживаются настольными браузерами, и это здорово, но бесполезно при работе с клиентами в основном Java ME. - person Carlos Carrasco; 01.10.2008
comment
Да, я только что заметил, что работает nginx 0.7.17. Я внесу его в список рассылки nginx. - person Dave Cheney; 12.10.2008

Fiddler, бесплатный инструмент от Telerik, выполняет по крайней мере некоторые из необходимых вам функций.

В частности, перейдите к Rules | Custom Rules..., и вы сможете добавить произвольный код Javascript на всех этапах соединения. Вы можете имитировать некоторые вещи, которые вам нужны, с помощью sleep() вызовов.

Однако я не уверен, что этот метод дает вам точное управление буферизацией, которое вы хотите. Тем не менее, может быть что-то лучше, чем ничего?

person Jason Cohen    schedule 18.09.2008
comment
Похоже, очень крутой инструмент для отладки HTTP! К сожалению, мне нужен прокси-сервер, а не настольный пользовательский интерфейс для мониторинга/манипулирования HTTP. - person Carlos Carrasco; 01.10.2008

Squid 2.7 может поддерживать 1-3 с патчем:

Я проверил это и обнаружил, что он работает хорошо, при условии, что он буферизуется только в память, а не на диск (если, конечно, он не свопается, а вы этого не хотите), поэтому вам нужно запустить его на коробке это должным образом подготовлено для вашей рабочей нагрузки.

Фрагментированные POST-запросы являются проблемой для большинства серверов и посредников. Вы уверены, что вам нужна поддержка? Обычно клиенты должны повторить запрос, когда они получают 411.

person Mark Nottingham    schedule 15.04.2010

К сожалению, я не знаю готового решения для этого. В худшем случае рассмотрите возможность самостоятельной разработки, скажем, с помощью Java NIO — это не займет больше недели.

person Alexander    schedule 19.09.2008