2009-05-13 14 views

Odpowiedz

30

Po pierwsze, należy skonfigurować moduł równoważenia obciążenia dla sesji koligacji sesji/sesji klejących, aby kontynuować przekazywanie wszystkich żądań do tego samego serwera Tomcat (o ile jest on wyższy) w oparciu o JSESSIONID.

The Tomcat clustering doc stwierdza dwa ważne wymagania dla aplikacji z powodzeniem mieć to sesje replikowane:

  • Wszystkie atrybuty sesji musi implementować java.io.Serializable
  • Upewnij się web.xml ma element <distributable/> lub ustawić w swojej <Context distributable="true" />

Jeśli zaczniesz wprowadzać obiekty do sesji, które nie implementują Serializable (lub które właściwości/pola, które nie implementują Serializable), wtedy będziesz mieć problemy.

(Faktycznie te punkty wszystkim zastosowanie niezależnie od tego, który servlet pojemnik używasz, wierzę).

Aktualizacja: Aby rozwiązać niektóre z pytań w komentarzach o tym, dlaczego używać lepkie sesje podczas równoważenia ładuj między wieloma serwerami, myślę, że najłatwiej to wytłumaczyć na przykładzie.

Po pierwsze, ma to znaczenie tylko wtedy, gdy aplikacja przechowuje dane w trakcie sesji, co może nie być każdą aplikacją (chociaż prawdopodobnie jest to większość). Jeśli nie przechowujesz danych w sesji, prawdopodobnie nie będziesz się tym przejmował i możesz przestać czytać tutaj.

Posiadanie środowiska, w którym przechowujesz dane w sesji, ale robisz , a nie mają lepkie sesje otworzyłyby świat bóle głowy.

Załóżmy, że first.jsp aktualizuje pewną wartość w danym atrybucie sesji, a second.jsp ma odczytać ten sam atrybut sesji. Możesz skonfigurować Tomcat, aby replikować dane sesji do wszystkich serwerów w klastrze, ale ta replikacja nie nastąpi natychmiast. Co się stanie, jeśli początkowy wniosek o wydanie first.jsp zostanie obsłużony przez i jedną nanosekundę po jego zakończeniu, ten sam odwiedzający zgłasza żądanie do second.jsp, które w twoim nieprzylepnym środowisku zostanie obsłużone przez server2. Ponieważ replikacja nie jest natychmiastowa, czy masz jakiś sposób, aby dowiedzieć się, czy czytasz najbardziej aktualne dane sesji? Czy musisz dodać jakąś logikę do synchronizowania twoich odczytów w klastrze? To stałoby się ogromnym bólem.

Ustawienie sesji powinowactwa/sesji klejącej usuwa ten ból głowy; mając wszystkie żądania z tego samego serwera klienta przez ten sam węzeł, nie musisz się martwić o "czy ten węzeł jest aktualny do czasu, kiedy obsługuje żądanie?" Gdy węzeł ulegnie awarii, klient nadal może przełączać się na inny węzeł w klastrze, który ma kopię danych sesji, ale w przypadku sesji lepkich staje się to rzadkim przypadkiem, a nie normą.

Jest jeszcze jeden powód, dla którego warto przylepiać sesje: ładowanie między węzłami w klastrze.Jeżeli wniosek w sesji może być obsługiwane przez każdego węzła, to będzie oznaczać, że masz wszystko do wszystkich replikacji skonfigurować w klastrze (czyli dane sesji node1 jest replcated do node2, Node3, ..., węzeł N, dane sesji węzła2 są replikowane na węzeł 1, węzeł3, ... brak N itd.). All-do-wszystkich sesji replikacji może stać się przepustowość i zasobochłonne gdy klaster staje się większy, ponieważ każdy dodatek do klastra oznacza kolejny węzeł, który musi komunikować się z każdym innym pojedynczym węźle w klastrze.

Alternatywą jest, aby dane węzła były replikowane tylko dla kilku "znajomych" w klastrze, tak aby w przypadku awarii węzła dane były dostępne gdzie indziej, ale bez konieczności posiadania jednego węzła. W tym scenariuszu można skonfigurować klaster, tak aby node1 ma swoje dane replikowane do węzłów 2 i 3 węzłów 2 ma swoje dane replikowane do węzłów 3 i 4, itd, tworząc łańcuch. W tym scenariuszu dodanie dodatkowych węzłów do klastra nie powoduje szybkiego zwiększenia komunikacji między węzłami, tak jak ma to miejsce w schemacie all-to-all.

+0

W swoim pierwszym oświadczeniu, masz na myśli, że jeśli zostanie wybrany Tomcat obsługiwać pierwsze żądanie samo Tomcat musi być używany do obsługi następujące wnioski pochodzące z tej przeglądarki. W takim przypadku, w jaki sposób pomaga równoważenie obciążenia, jeśli ten sam serwer Tomcat obsługuje wszystkie żądania? – user32262

+0

Myślę, że główną ideą równoważenia obciążenia jest używanie wielu serwerów do obsługi wielu klientów. Nie oznacza to, że wszystkie żądania pochodzące od tego samego klienta powinny być dystrybuowane do wielu serwerów. Tylko myśl, nie jestem pewien. –

+0

Struts nie różni się w tym przypadku. Trzymaj się porad dostarczonych przez Matta. +1 –

Powiązane problemy