2010-09-03 18 views
5

Estoy trabajando en una aplicación web distribuida y decidimos separar el módulo web de los servicios empresariales para hacerlo más escalable.Administrar sesión dentro de la aplicación distribuida

Aquí está la situación: Tenemos una instancia de servidor que mantiene la aplicación web (Controladores, JSP, etc.) y muchas instancias de servidor con servicios comerciales. Si la aplicación web necesita algún dato, pregunta a alguno de los servidores comerciales existentes a través de Hessian al respecto, luego obtiene la respuesta y muestra los datos.

Actualmente estamos recuperando datos de la base de datos en base al usuario conectado y esto no se puede cambiar, por lo que cada servidor debe saber qué usuario pidió hacer el trabajo.

Mi pregunta es: ¿Conoces la solución para mantener la sesión del usuario en varias aplicaciones independientes?

Por ejemplo, una de las soluciones se puede enviar con cada solicitud, pero esta no es una muy buena idea para nosotros.

Muchas gracias

+0

Gracias a todos. Encontré la mejor solución. Simplemente deberíamos agregar un nombre de usuario (o lo que sea) como encabezado de solicitud HTTP y recuperarlo del otro lado. Es muy fácil con Hessian solo debe extender HessianProxy e implementar el método addRequestHeaders (URLConnection). Tenga cuidado – oyushche

Respuesta

2

Hay 2 enfoques para este problema:

1) Se almacena toda la información de sesión en el servidor de memcached centro

2) Utilice sesión de cuenta balanceador de carga, que dirigirán mismos usuarios a los mismos nodos.

+0

3) Almacene todas las sesiones en una base de datos maestra replicada que admita múltiples réplicas de cada sesión. De esta forma, tendrá conmutación por error. Además, vea mi respuesta obvia aquí que podría darle una idea: http://stackoverflow.com/a/8443896/260805 – Ztyx

4

Usa hashtable distribuido para almacenar y recuperar tus sesiones desde cualquier servidor. Pruebe Hazelcast por ejemplo. Es de código abierto y súper simple; vea la muestra a continuación.

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 es de igual a igual. Solo incluye un solo frasco y comienza a compartir tus sesiones.

Cuestiones relacionadas