2010-09-03 8 views
5

Pracuję nad rozproszoną aplikacją internetową i zdecydowaliśmy się na oddzielenie modułu internetowego od usług biznesowych, aby był bardziej skalowalny.Zarządzaj sesją w aplikacji rozproszonej

Oto sytuacja: Mamy jedną instancję serwera, która przechowuje aplikacje internetowe (kontrolery, strony JSP itp.) Oraz wiele instancji serwera z usługami biznesowymi. Jeśli aplikacja internetowa potrzebuje jakichkolwiek danych, pyta o istniejący serwer biznesowy za pośrednictwem Hessian, a następnie otrzymuje odpowiedź i wyświetla dane.

Obecnie pobieramy dane z bazy danych na podstawie zalogowanego użytkownika i nie można tego zmienić, dlatego każdy serwer powinien wiedzieć, który użytkownik poprosił o wykonanie pracy.

Moje pytanie brzmi: Czy znasz rozwiązanie pozwalające utrzymać sesję użytkownika w kilku niezależnych aplikacjach?

Na przykład jedno z rozwiązań można wysłać nazwę użytkownika przy każdym żądaniu, ale nie jest to dla nas dobry pomysł.

Thanks a lot

+0

Dziękuję wszystkim. Znalazłem najlepsze rozwiązanie. Powinniśmy po prostu dodać nazwę użytkownika (lub cokolwiek innego) jako nagłówek żądania http i pobrać go po drugiej stronie. Z Hessianem bardzo łatwo można rozszerzyć tylko HessianProxy i zaimplementować metodę addRequestHeaders (URLConnection). Zachowaj ostrożność – oyushche

Odpowiedz

2

Istnieją 2 podejścia do tego problemu:

1) przechowywać wszystkie informacje o sesji w centralnym serwerze memcached

2) Użyj sesji świadomy load-balancer, które będą kierowały ci sami użytkownicy do tych samych węzłów.

+0

3) Przechowuj wszystkie sesje w replikowanej bazie danych master-master, która obsługuje wiele replik każdej sesji. W ten sposób będziesz mieć przełączanie awaryjne. Zobacz także moją odpowiedź, która może dać ci pewien wgląd: http://stackoverflow.com/a/8443896/260805 – Ztyx

4

Użyj rozproszonego hashtable do przechowywania i pobierania sesji z dowolnego serwera. Wypróbuj na przykład Hazelcast. Jest open source i super prosty; patrz przykład poniżej.

Map<String, Session> mapSessions = Hazelcast.getMap("sessions"); 
// session is created or updated so put it into the sessions map 
mapSessions.put(sessionId, session); 
// any server needing to access a session should just retrieve 
// it from the map. 
// Map is distributed/shared so any JVM running Hazelcast can 
// read the sessions. 
Session session = mapSessions.get(sessionId); 

Hazelcast to peer-to-peer. Wystarczy dołączyć pojedynczy słoik i zacząć udostępniać swoje sesje.