2010-09-03 42 views
5

Sto lavorando a un'applicazione Web distribuita e abbiamo deciso di separare il modulo Web dai servizi aziendali per renderlo più scalabile.Gestisci sessione all'interno dell'applicazione distribuita

Questa è la situazione: Abbiamo un'istanza del server che mantiene le applicazioni Web (controller, JSP, ecc.) E molte istanze del server con i servizi aziendali. Se l'applicazione web ha bisogno di dati, chiede a qualsiasi server aziendale esistente via Hessian, quindi riceve la risposta e visualizza i dati.

Attualmente stiamo recuperando i dati dal DB in base all'utente connesso e questo non può essere modificato, quindi ogni server dovrebbe sapere quale utente ha chiesto di fare il lavoro.

La mia domanda è: Conoscete la soluzione per mantenere la sessione utente su più applicazioni indipendenti?

Ad esempio, una delle soluzioni può inviare nome utente a ogni richiesta, ma questa non è una buona idea per noi.

Grazie mille

+0

Grazie a tutti. Ho trovato la soluzione migliore. Dovremmo semplicemente aggiungere il nome utente (o qualsiasi altra cosa) come intestazione della richiesta http e recuperarlo dall'altra parte. È molto semplice con Hessian estendere solo HessianProxy e implementare il metodo addRequestHeaders (URLConnection). Fare attenzione – oyushche

risposta

2

Ci sono 2 approcci per questo problema:

1) Conservare tutte le informazioni di sessione nel server di memcached centrale

2) Utilizzare sessione-aware bilanciamento del carico, che dirigeranno stessi utenti per gli stessi nodi.

+0

3) Archiviare tutte le sessioni in un database replicato master-master che supporti più repliche di ogni sessione. In questo modo, avrai il failover. Inoltre, vedi la mia risposta provata qui che potrebbe darti qualche informazione: http://stackoverflow.com/a/8443896/260805 – Ztyx

4

Utilizzare la tabella hash distribuita per archiviare e recuperare le sessioni da qualsiasi server. Prova ad esempio Hazelcast. È open source e super semplice; guarda l'esempio qui sotto.

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 è peer-to-peer. Basta includere un singolo barattolo e iniziare a condividere le tue sessioni.