2010-09-03 30 views
5

Ich arbeite an verteilter Webanwendung und entschied uns, das Webmodul von den Geschäftsdiensten zu trennen, um es besser skalierbar zu machen.Sitzung in verteilter Anwendung verwalten

Hier ist die Situation: Wir haben eine Server-Instanz, die Web-Anwendung (Controller, JSPs, etc) und viele Server-Instanzen mit Business-Services hält. Wenn die Webanwendung irgendwelche Daten benötigt, fragt sie einen vorhandenen Geschäftsserver über Hessian ab, erhält dann die Antwort und zeigt Daten an.

Momentan rufen wir Daten aus der Datenbank ab, basierend auf dem eingeloggten Benutzer, und dies kann nicht geändert werden, so dass jeder Server wissen sollte, welcher Benutzer die Aufgabe erledigt hat.

Meine Frage ist: Kennen Sie die Lösung, um Benutzersitzung über mehrere unabhängige Anwendungen zu halten?

Zum Beispiel kann eine der Lösungen Benutzername mit jeder Anfrage senden, aber das ist keine sehr gute Idee für uns.

Vielen Dank

+0

Danke euch allen. Ich habe die beste Lösung gefunden. Wir sollten einfach den Benutzernamen (oder was auch immer) als HTTP-Anfrage-Header hinzufügen und auf der anderen Seite abrufen. Es ist sehr einfach mit Hessian sollten Sie nur HessianProxy erweitern und addRequestHeaders (URLConnection) -Methode implementieren. Pass auf dich auf – oyushche

Antwort

2

Es gibt zwei Ansätze für dieses Problem:

1) Speichern Sie alle Sitzungen Informationen in zentralen Memcached Server

2) Verwenden Sie Session-aware Lastenausgleich, die leiten wird gleiche Benutzer zu den gleichen Knoten.

+0

3) Speichere alle Sitzungen in einer replizierten Master-Master-Datenbank, die mehrere Replikate jeder Sitzung unterstützt. Auf diese Weise haben Sie Failover. Siehe auch meine provious Antwort hier, die Ihnen einige Einblicke geben könnte: http://stackoverflow.com/a/8443896/260805 – Ztyx

4

Verwenden Sie die verteilte Hashtabelle zum Speichern und Abrufen Ihrer Sitzungen von einem beliebigen Server. Versuchen Sie zum Beispiel Hazelcast. Es ist Open Source und super einfach; Siehe das Beispiel unten.

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 ist Peer-to-Peer. Fügen Sie einfach ein einzelnes Krug ein und beginnen Sie, Ihre Sitzungen zu teilen.

Verwandte Themen