#java #web-applications
#java #веб-приложения
Вопрос:
Я хотел бы запустить веб-контейнер, где каждое веб-приложение выполняется в своем собственном процессе (JVM). Входящие запросы пересылаются прокси-веб-приложением, работающим на порту 80, отдельным веб-приложениям, каждое из которых (webapp) выполняется на своем собственном порту в своей собственной виртуальной машине.
Это решит три проблемы:
- Веб-приложения, использующие JNI (где код JNI изменяется между перезапусками), не могут быть перезапущены. Невозможно гарантировать, что старое веб-приложение было очищено от мусора перед загрузкой нового веб-приложения, поэтому, когда код вызывает System.LoadLibrary(), JVM выдает:
java.lang.UnsatisfiedLinkError: Native Library x already loaded in another classloader.
- Библиотеки пропускают память каждый раз при перезагрузке веб-приложения, что в конечном итоге приводит к полному перезапуску сервера. Tomcat добился прогресса в решении этой проблемы, но она никогда не будет полностью исправлена.
- Более быстрые перезапуски. Механизм, который я предлагаю, позволил бы почти мгновенный перезапуск веб-приложения. Нам больше не нужно ждать завершения выгрузки старого веб-приложения, что является самой медленной частью.
Я разместил RFE здесь и здесь. Я хотел бы знать, что вы думаете.
Делает ли это какой-либо существующий веб-контейнер сегодня?
Ответ №1:
Я закрываю этот вопрос, потому что, похоже, я зашел в тупик: http://tomcat.10.n6.nabble.com/One-process-per-webapp-td2084881.html
В качестве обходного пути я вручную запускаю отдельный экземпляр Jetty для каждого веб-приложения.
Ответ №2:
Разве вы не можете просто развернуть по одному приложению на контейнер, а затем использовать записи DNS и обратные прокси, чтобы сделать то же самое? Я полагаю, что у Weblogic есть нечто подобное в виде управляемых доменов.
Комментарии:
1. предоставляя единый интерфейс управления для нескольких веб-приложений, вы могли бы повысить производительность, которая сегодня невозможна при использовании отдельных контейнеров. Например: когда пользователь просит перезагрузить веб-приложение, вы могли бы предварительно загрузить веб-приложение без контейнера, простаивающее в фоновом режиме. Когда поступают запросы на перезагрузку, вы просто выключаете старую JVM и загружаете новое веб-приложение в ожидающую JVM. Если бы я должен был реализовать это сегодня, завершение работы экземпляра и повторный запуск его последовательно заняли бы намного больше времени (и, следовательно, снизили бы производительность разработки).
Ответ №3:
Нет, AFAIK, ни один из них этого не делает, вероятно, потому, что веб-контейнеры Java подчеркивают важность следования servlet API, который запускает поток для каждого http-запроса. То, что вы хотите, было бы форком на уровне JVM — и это просто не стандартная идиома Java.
Комментарии:
1. Я не прошу каждый http-запрос запускаться в его собственной JVM. Я изолирую каждое веб-приложение в его собственной JVM, а не каждый запрос одного и того же веб-приложения.
Ответ №4:
Если я правильно понимаю, вы запрашиваете стандартные функции для серверов корпоративного качества, таких как IBM WebSphere Network Deployment (отказ от ответственности, я работаю в IBM), где вы можете распространять приложения по многим JVM, и эти JVM фактически могут быть распределены по многим физическим машинам.
Однако я не уверен, что ваша фундаментальная предпосылка верна. Нет необходимости перезапускать всю JVM, чтобы развернуть новую версию приложения. Многие серверы приложений будут использовать стратегию загрузки классов, которая позволяет им отбрасывать версию приложения и загружать новую.
Комментарии:
1. Вы неправильно поняли мой вопрос. Мне не не нужно веб-приложение для работы с JVMS. Насколько я знаю, не существует безопасного способа перезапуска приложения JNI, кроме перезапуска всей JVM, поэтому специальная стратегия загрузки классов здесь не сработает.