Как создать интерфейсный HTTP-прокси для обслуживания приложения без простоев?

Как создать интерфейсный HTTP-прокси для обслуживания приложения без простоев?

У нас есть веб-приложение на Java (хотя язык не имеет особого значения для данного вопроса), и оно работает под управлением Apache через простой прокси-сервер.

Есть ли способ поставить в очередь все HTTP-запросы от клиентов (чтобы их HTTP-соединение сохранялось и не прерывалось), пока мы отключаем Java Application Server (или любой другой контейнер...) с нашим приложением. Обслуживание занимает <60 секунд, поэтому идея заключается в том, что мы просто развертываем новую версию приложения, а затем говорим «разрешить трафик обратно в веб-приложение», так что клиенты будут испытывать задержку, но не прерывание соединений, поскольку поставленные в очередь запросы не смогут достичь нашего приложения.

Чтобы внести больше ясности, мы не имеем дело с веб-сайтом, но на самом деле это запросы API, выполняемые по протоколу HTTP, и клиенты фактически используют библиотеки кода, которые поддерживают указанную задержку, поэтому клиенты будут знать, что им нужно подождать (пока мы проводим обслуживание).

Есть идеи? Если нужно, мы можем разработать небольшое приложение для этого, если нет очевидного/готового решения, хотя это очень распространенная проблема, с которой сталкивается в основном любой, кто предоставляет HTTP API своим клиентам.

решение1

А как насчет следующего принципа? Допустим, это mod_proxy, убедитесь, что ProxyTimeout и ProxyPass connectiontimeout= (и, возможно, retry=) равны как минимум времени обслуживания или тайм-ауту простоя клиента API.

Затем, перед обслуживанием, заблокируйте все новые соединения на бэкэнде, например iptables -I INPUT -p tcp --syn --dport 8080 -j DROP. После обслуживания удалите правило с помощью iptables -D.

Значение MaxClients может оставаться низким, но его можно увеличить, ListenBackLogесли время ожидания TCP-соединения на клиенте короткое.

решение2

Просто запустите новую версию приложения в ее собственном экземпляре (т. е. на другом порту) и обновите конфигурацию обратного прокси-сервера, чтобы перенаправлять запросы на новый экземпляр, что можно сделать без простоя. ( apachectl reload)

Затем удалите старую версию и экземпляр, освободив ресурсы.

Связанный контент