Java - Горячее развертывание

Недавно я читал книгу об Erlang, в которой есть функция горячего развертывания. Развертывание может быть выполнено без остановки системы. Все существующие запросы будут обрабатываться старой версией кода, а все новые запросы после развертывания будут обслуживаться новым кодом. В этом случае обе версии кода доступны во время выполнения в течение некоторого времени, пока не будут обработаны все старые запросы. Есть ли какой-либо подход в Java, где мы можем сохранить 2 версии файлов JAR? Есть ли какие-либо приложения / веб-серверы поддерживают это?

5 ответов

Решение

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

Вот некоторые хорошие предложения / варианты для рассмотрения:

  • OSGi - это модульная система общего назначения, которая поддерживает горячее развертывание.
  • Clojure - это динамический язык JVM, который обеспечивает большую интерактивность во время выполнения. Clojure часто используется для "живого" кодирования - практически все может быть заменено в горячем режиме и переопределено во время выполнения. Clojure - это функциональный язык с сильным акцентом на неизменяемость и параллелизм, поэтому в некоторых отношениях он имеет некоторые интересные сходства с Erlang. Clojure имеет несколько очень хороших веб-фреймворков, таких как Noir, которые подходят для горячей замены кода.
  • Платформа Play Framework предназначена для обеспечения возможности горячей замены кода в целях повышения производительности (исключая перезапуски веб-сервера). Может быть уместно, если вы смотрите в первую очередь на горячие замены веб-приложений.
  • Большинство серверов приложений Java, таких как JBoss, поддерживают некоторую форму горячей замены для веб-приложений.

Если вы хотите ускорить разработку, то JRebel - инструмент для этой цели. Однако я бы не рекомендовал использовать его для исправления производственной системы.

JRebel обнаруживает всякий раз, когда файл класса изменился, и перезагружает его в работающий сервер приложений, не выбрасывая старого состояния. Это намного быстрее по сравнению с тем, что делает большинство appservers при повторном развертывании всей войны / ушей, где весь процесс инициализации должен быть перезапущен.

Единственная причина для горячих обновлений в производственном приложении - это обеспечение нулевого времени простоя для пользователей.

LiveRebel (на основе JRebel) - это инструмент, который можно использовать, например, совместно с Jenkins. Он может выполнять безопасную горячую установку, а также повторные перезапуски, истощая сеансы в производственном кластере.

Технически, вы МОЖЕТЕ сделать это самостоятельно. Хотя я бы не советовал, потому что это может быстро усложниться. Но идея в том, что вы можете создать ClassLoader и загрузить новую версию вашего класса. Затем убедитесь, что ваш исполняемый код знает о новом ClassLoader.

Я бы порекомендовал просто использовать JBoss и повторно использовать ваши банки и войны. Красиво и просто по большей части.

В любом случае вы должны убедиться, что у вас нет утечек памяти, потому что после нескольких перераспределений у вас закончится пространство PermGen.

Добавьте RelProxy к вашему набору инструментов, RelProxy - это горячая перезагрузка класса для Java (и Groovy), чтобы улучшить разработку даже для производства, с одним существенным ограничением, перезагрузка возможна только в подмножестве вашего кода.

Другие вопросы по тегам