Корректная работа с tomcat deploy

Никита Кардашин megalin2 at gmail.com
Tue Oct 28 17:31:11 UTC 2014


Привет всем,

Каким образом можно корректно работать с tomcat-upstream, который
используется для java-приложения, deploy которого занимает несколько минут?

Среда:
На входе стоит nginx proxy, в котором настроено n апстримов в режиме
round-robin с max_fail=1. За ним - n серверов приложений, на которых
работает Apache Tomcat, в котором работает java-приложение.

Если падает один из серверов приложений - все прекрасно, nginx стучится к
нему, получает 500/502 и выкидывает апстрим из списка доступных на заданное
время и рероутит запрос на другой апстрим. Пользователь проблемы не видит.
Но это если упало совсем. Если не упало, а зависло или ушло в re-deploy
(либо мы сами стартовали re-deploy) - возникает проблема.

Проблема:
Деплой java-приложения в случае краша или обновления занимает несколько
минут (в особо злом случае - до десяти). Томкат, сволочь, в это время
принимает входящие соединения на свой порт, но не обслуживает их, а вешает
на холд до момента завершения деплоя приложения. Nginx принимает коннект от
пользователя, маршрутизирует запрос к апстриму, и... ждет 3-5 минут пока
бэкэнд не поднимется.
В итоге пользователь видит белый экран или частично загрузившуюся страницу
(как повезет раунд-робином), хотя в живых есть куча других апстримов,
которые могли бы обслужить его запрос.

Осложняется ситуация тем, что апстрим в некоторых ситуациях может долго
думать или отдавать много данных и решить проблему "в лоб", урезав
proxy_read_timeout до нескольких секунд - нельзя.

Меня может что-то спасти?


-- 
With best regards,
differentlocal (www.differentlocal.ru | differentlocal at gmail.com),
System administrator.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20141028/37d93f53/attachment-0001.html>


Подробная информация о списке рассылки nginx-ru