<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">28 октября 2014 г., 20:31 пользователь Никита Кардашин <span dir="ltr"><<a href="mailto:megalin2@gmail.com" target="_blank">megalin2@gmail.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><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></div></blockquote><div><br></div><div><br></div><div>Помечать неработающие бекенды как down -> nginx reload -> deploy -> убираем down -> nginx reload</div><div><br></div></div><br></div></div>