<div dir="ltr">Привет всем,<div><br></div><div>Каким образом можно корректно работать с tomcat-upstream, который используется для java-приложения, deploy которого занимает несколько минут?</div><div><br></div><div>Среда:</div><div>На входе стоит nginx proxy, в котором настроено n апстримов в режиме round-robin с max_fail=1. За ним - n серверов приложений, на которых работает Apache Tomcat, в котором работает java-приложение. <br clear="all"><div><br></div><div>Если падает один из серверов приложений - все прекрасно, nginx стучится к нему, получает 500/502 и выкидывает апстрим из списка доступных на заданное время и рероутит запрос на другой апстрим. Пользователь проблемы не видит. Но это если упало совсем. Если не упало, а зависло или ушло в re-deploy (либо мы сами стартовали re-deploy) - возникает проблема.</div><div><br></div><div>Проблема:</div><div>Деплой java-приложения в случае краша или обновления занимает несколько минут (в особо злом случае - до десяти). Томкат, сволочь, в это время принимает входящие соединения на свой порт, но не обслуживает их, а вешает на холд до момента завершения деплоя приложения. Nginx принимает коннект от пользователя, маршрутизирует запрос к апстриму, и... ждет 3-5 минут пока бэкэнд не поднимется. </div><div>В итоге пользователь видит белый экран или частично загрузившуюся страницу (как повезет раунд-робином), хотя в живых есть куча других апстримов, которые могли бы обслужить его запрос.</div><div><br></div><div>Осложняется ситуация тем, что апстрим в некоторых ситуациях может долго думать или отдавать много данных и решить проблему "в лоб", урезав proxy_read_timeout до нескольких секунд - нельзя.</div><div><br></div><div>Меня может что-то спасти?</div><div><br></div><div><br></div>-- <br>With best regards,<br>differentlocal (<a href="http://www.differentlocal.ru">www.differentlocal.ru</a> | <a href="mailto:differentlocal@gmail.com">differentlocal@gmail.com</a>),<br>System administrator.
</div></div>