2012-04-16 9 views
11

Mam jedną WAR (app.war) i jeden kontener (Tomcat, Jetty, Glassfish, cokolwiek). Moim celem jest wdrożenie na żądanie setek instancji tej samej aplikacji internetowej na kontenerze.Skutecznie wdrażaj wiele wystąpień tego samego WAR (różne konteksty, ten sam kontener)

http://foo/app1 --> app.war 
http://foo/app2 --> app.war 
http://foo/app3 --> app.war 
... 
http://foo/appN --> app.war 

Niektóre oczywiste sposoby osiągnięcia tego celu:

  • W Tomcat, tworzą jeden plik context.xml dla każdej aplikacji (o nazwie appN.xml), wszystko wskazuje na samej wojnie. Inne pojemniki mają podobne metody
    • problem z tym podejściem: Będzie wybuch wojny N razy, zajmując dużo miejsca na dysku
  • Użyj dowiązania symboliczne do tworzenia webapp/{App1, App2, APPN} foldery wskazując na wybuchową wersję app.war. Zapobiega to eksplozji miejsca na dysku, ale JVM wciąż ładuje wiele duplikatów JAR do pamięci.
  • Użyj współdzielonego folderu lib, aby zawierał większość słoików (i kombinację dwóch poprzednich opcji).

Zastanawiam się, czy istnieje lepsza metoda, aby to zrobić. W idealnej sytuacji utworzenie nowej instancji nie powinno zajmować więcej miejsca na dysku (poza marginalnymi plikami konfiguracyjnymi) i zajmować tylko pamięć związaną ze stosami wykonania wątków i innymi alokacjami środowiska wykonawczego.

Wszelkie pomysły?

+0

Czy rozważasz przepisanie aplikacji jako wielodostępnej aplikacji? Jeśli istnieje 100s wystąpień dokładnie tego samego WAR i kodu, rozważabym zaprojektowanie tylko 1 WAR, które zostałyby wdrożone do kontekstu root'a? – beny23

+0

@ beny23 Rozbudowane wyjaśnienie może mi również pomóc w niektórych rzeczach, nad którymi pracuję. Czy masz jakąś szansę? –

+0

Poniżej zamieściłem odpowiedź, ale jeśli powiesz nam, dlaczego chcesz to zrobić, być może uda mi się opublikować lepszy. – ccleve

Odpowiedz

5

Jetty dodał wsparcie dla tego, czego szukałeś przez jakiś czas, z tak zwanymi nakładkami.

http://wiki.eclipse.org/Jetty/Tutorial/Configuring_the_Jetty_Overlay_Deployer

Kopiowanie nieco od strony wiki:

  • można zachować plik WAR niezmienne, nawet podpisana, więc oczywiste jest, która wersja zostały wdrożone.
  • Wszystkie modyfikacje dokonane w celu dostosowania/skonfigurowania aplikacji internetowej są oddzielnymi WARami, a zatem można je łatwo zidentyfikować w celu przejrzenia i migracji do nowych wersji.
  • Można utworzyć sparametryzowaną nakładkę szablonów, która zawiera typowe dostosowania i konfiguracje, które mają zastosowanie do wielu wystąpień aplikacji internetowej (na przykład w przypadku wdrożenia z wieloma dzierżawcami).
  • Ponieważ rozmieszczenie warstwowe jednoznacznie identyfikuje komponenty wspólne i specyficzne dla danej instancji, Jetty może współużytkować moduły ładujące klasy i pamięci podręczne zasobów dla szablonu, znacznie zmniejszając ślad pamięci wielu instancji.
1

Można skonfigurować Apache na interfejsie użytkownika (mod_proxy/mod_proxy_ajp), aby wskazywać na nazwy wirtualnych hostów na pojedynczą operację WAR wdrożoną na serwerze Tomcat. Twoja aplikacja powinna być zaprojektowana/napisana w taki sposób, aby obsłużyć wszystkie żądania - na nazwę strony konkretna konfiguracja może być przechowywana w bazie danych lub jako plik konfiguracyjny w aplikacji - Twoja aplikacja będzie po prostu musiała sprawdzać nazwę domeny żądającej użytkownika upewnij się, że ustawienia są poprawne (raz na sesję). Ogólnie mówiąc, powinieneś być w stanie rozwiązać to za pomocą jednej aplikacji. Świetni programiści są LAZY.

0

Jeśli dotyczy to eksperymentu, każda z wymienionych metod może działać.

Jeśli jest to przeznaczone do produkcji, polecam od tego. Chociaż nie przetestowałem WSZYSTKICH pojemników, używane przeze mnie pojemniki sprawiły, że uważam, że jest o wiele bardziej odporne na proste dostarczanie bezgłowych maszyn wirtualnych z kontenerami. Maszyny wirtualne systemu Linux mogą być bardzo małe, a dzięki technologii VM można dodawać lub odejmować tyle instancji, ile potrzeba.

Jeśli naprawdę chcesz mieć dynamicznie rozwijające się rozwiązanie, powinieneś poszukać wyeliminowania pojedynczych punktów awarii, a następnie spróbować zjednoczyć cały świat w jeden.

Jeśli naprawdę potrzebujesz "do drugiego" rozszerzenia/kurczenia obciążenia, powinieneś spojrzeć na AWS lub CloundFoundry.

+0

Tak, dostarczaliśmy jeden komputer na użytkownika/aplikację. Głównym problemem są koszty. Niektórzy użytkownicy nie używają ich przez pewien czas i chciałbym przenieść je na "udostępniony" komputer. Możliwe jest również rozrośnięcie jednego procesu VM na wystąpienie, ale próbuję ustalić, która metoda ma mniej narzutów: wiele maszyn wirtualnych/kontenerów lub wiele instancji na kontener. –

0

Jeśli korzystasz z Jetty, możesz programowo dodawać konteksty.

WebAppContext webapp = new WebAppContext(); 
webapp.setBaseResource(myBaseDirectory); 
webapp.setContextPath(myContextPath); 

Po prostu wykonaj to w pętli dla wszystkich kontekstów. Powinien mieć blisko zerowej przestrzeni dyskowej.

Jest prawdopodobnie podobny sposób na zrobienie tego w Tomcat.

+0

OK. Nie testowałem tego. Czy spowoduje to, że WAR zostanie rozbity na folder "pracy"? –

+0

Nie, nie sądzę. A jeśli tak, to eksploduje tylko w jednym folderze, a nie w jednym kontekście. – ccleve

2

Przepraszamy za bycie nieco nietypowym, ale moim zdaniem scenariusz krzyczy "multi-tenancy" aplikacji, tak, że masz jedną aplikację, która będzie obsługiwać wielu "najemców" (klientów).

W odniesieniu do konfiguracji multi-najmu, poniższe rozważania musiałby uznać:

Korzyści z wielodostępności:

  • Współdzielony kod oznacza, że ​​błąd ustalony dla jednego klienta jest ustalony dla wszystkich (może to być również niekorzystne, jeśli różni klienci mają różne poglądy na temat tego, co stanowi błąd i co stanowi cechę).
  • Instalacja klastrowa może dzielić obciążenie między klientami (należy jednak upewnić się, że maksymalna pojemność jest dostępna dla wszystkich klientów).

Wady:

  • Kod będzie nieco bardziej złożone, jak kwerendy należy się upewnić, że „dyskryminacja” między klientami działa bez przypadkowym ruchom narażając klientów na każdym innym danych.
Powiązane problemy