Плавное переключение WAR в производство?

Мне было интересно, есть ли "плавный путь" перераспределения Java WAR на производственный сервер (без кластера, без OSGi)?

Все, что я могу придумать, это остановить сервер, файл обновления, перезапустить сервер. И за 10 минут до этого мне нужно отобразить предупреждение о техническом обслуживании на сайте.

Какой ваш подход?

Ответ 1

Во-первых, hot-deploy не всегда работает. Мы потратили столько времени, чтобы убедиться, что каждый новый модуль загружен и решил, что это не стоит проблем. Поэтому то, что вы делаете, может показаться плохим, но это самый надежный способ развертывания новой WAR.

Наш текущий подход заключается в использовании коммутатора с балансировщиком нагрузки перед всеми серверами. Мы запускаем как минимум 2 экземпляра серверов приложений. Когда мы завершаем работу одного сервера для обслуживания, трафик автоматически переходит к другому.

Некоторые из переключателей действительно недороги. Если у вас недостаточно нагрузки, чтобы оправдать новое поле, и ваши 2 экземпляра могут работать в одном окне.

В некоторых случаях коммутаторы могут фактически сэкономить деньги. Например, у нас есть страница SSL, которая использовала 6 ящиков, и теперь она отлично работает на двух ящиках с ускорением SSL в коммутаторе.

Ответ 2

Вы можете взглянуть на JRebel, хотя я бы не использовал его в процессе производства. В производстве мы делаем в основном то же самое, хотя наш босс продолжает мечтать о горячей передислокации. К сожалению, они поддерживаются в основном на бумаге - в самых сложных приложениях что-то всегда идет не так с горячим перераспределением. То же самое еще более верно для инкрементных горячих перераспределений...

Ответ 3

Некоторые серверы приложений поддерживают перераспределение без прерывания обслуживания. Это, по крайней мере, верно для WebLogic, см. Использование перепрофилирования для обновления приложений. Обратите внимание, что это не горячее развертывание (и я бы никогда не использовал горячее развертывание с рабочими серверами).

Без поддержки сервера приложений, боюсь, вы не сможете выполнять реальные "плавные" перераспределения. Если вы хотите минимизировать время простоя, один подход заключается в параллельном развертывании нового приложения (на том же сервере или другом) и изменении правил маршрутизации по завершении. Но клиенты потеряют свою сессию.

Ответ 4

Обычно возможно оптимизировать время запуска. Наше веб-приложение начинается с Jetty через 5-7 секунд. Другие веб-серверы Java хуже, потому что они начинаются очень медленно.

Кроме того, поскольку я знаю (не я сделал это), интерфейсный веб-сервер (такой как apache, мы используем lighttpd) может быть настроен на то, чтобы удерживать запрос в течение некоторого периода времени (до 30 секунд на нашем) в то время как Jetty не готов. Таким образом, мы просто перезагружаем Jetty при развертывании, а пользователи просто задерживают несколько секунд в худшем случае, что обычно выглядит как глюк интернет-соединения.

Ответ 5

Обычно, mv old.war new.war и пусть AS берет его оттуда, хотя с очень занятыми услугами 24/7, я полагаю, что это не вариант.

Ответ 6

Поскольку ZZ Coder уже упомянул балансировку нагрузки, это хорошее решение, особенно для крупных развертываний. Для моего собственного проекта я использую функцию back-back-proxy для веб-сервера nginx. Он перенаправляет все http-пакеты из определенного веб-контекста (видимого из Интернета) на сервер внутри моей сети. Конфигурация очень проста:

location /best-app-ever/ { proxy_pass host-address:8080/some-app-1.1 root /home/www/some-app-1.1 }

Переключающая версия также должна быть гладкой. Предполагая, что вы уже развернули новую версию приложения, просто измените конфигурационный файл nginx и примените изменения:

location /best-app-ever/ { proxy_pass host-address:8080/some-app-1.2 root /home/www/some-app-1.2 }

sudo nginx -t
sudo service nginx restart

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