Biblioteca de caché de código abierto integrable de Java simple, rápida y distribuida

Necesito almacenar el estado de la sesión para una aplicación web que se implementa en varios servidores. Quiero evitar las sesiones pegajosas o realizar la replicación de sesiones, ya que quiero que la aplicación sea independiente y no dependa de configuraciones específicas del contenedor de servlets.

Entonces, lógicamente, la única opción que queda es administrar la sesión en otro lugar y la dirección lógica es con una base de datos que comparten todos los servidores. Pero eso se convertirá en un cuello de botella (y un único punto de falla), además de que una base de datos relacional no está realmente diseñada para almacenar datos de sesión. Una solución NoSQL distribuida sería una mejor opción, pero aún así será otro componente para administrar.

Así que estaba pensando en una biblioteca de caché incrustable de Java rápida y distribuida que replique los datos en todos los nodos para que, sin importar a qué servidor llegue el cliente, tenga acceso al estado más reciente.

Hazelcast parece ser una buena opción, pero solo necesitaría un mapa sin ninguna otra característica de Hazelcast, por lo que parece demasiado para un contenedor distribuido de pares clave-valor.

Pero aparte de eso, parece que no puedo encontrar ninguna otra biblioteca que se adapte a la necesidad. Idealmente, debería ser una biblioteca de código abierto, algo que pueda usar libremente en un producto comercial.

¿Algunas ideas?

He usado EHCache pero supongo que no es más ligero que Hazelcast...
@Nicolas Raoul: Gracias por la sugerencia, pero estoy buscando una biblioteca de código abierto (actualicé mi pregunta). Hasta donde yo sé, EHCache distribuido significa Terracotta y BigMemory Max, que tienen licencia.
"Terracotta desarrolla, mantiene y respalda activamente a Ehcache como un proyecto profesional de código abierto disponible bajo una licencia Apache 2". ehcache.org
@Nicolas Raoul: eso no es lo que quise decir. Tengo entendido que las capacidades distribuidas de EHCache no están disponibles en la distribución de código abierto, por ejemplo, ehcache.org/documentation/get-started/about-distributed-cache . ¿Me equivoco?
EHCache está integrado en el producto de código abierto Alfresco y proporciona funciones de caché distribuida. Así que estoy bastante seguro de que las capacidades distribuidas de EHCache también están disponibles en la distribución de código abierto. Esa página es bastante engañosa, están tratando de vender la versión de código abierto, diría yo.
avellana es bueno. pero no tengo idea de un mecanismo de persistencia: stackoverflow.com/questions/25621860/…
@NicolasRaoul, ¿tiene un enlace a la documentación sobre esta característica? ¿Está en ehcache 2 y estará en 3 también?
@Karussell: Lo siento, realmente no recuerdo los detalles :-/

Respuestas (2)

Los cachés Ehcache y Guava son cachés en proceso bastante populares y útiles. Si es posible usar un proceso externo para el caché, Memcached y Redis se adaptan bien a este propósito.

Que yo sepa, Guava Cache no se distribuye. Redis es una solución NoSQL escrita en C y no se puede incrustar en una aplicación Java (puede incrustar un cliente Java pero no la instalación de Redis) mientras que Memcached no funciona como yo quiero (que es tener los mismos datos en todos los nodos, es decir, la replicación).

Divulgación completa: trabajo para Alachisoft.

Puede consultar NCache para .Net o TayzGrid para la caché distribuida de Java . Ambos proyectos son de código abierto.

Su requisito es obtener;

Biblioteca de caché incrustable de Java rápida y distribuida que replica los datos en todos los nodos para que, independientemente del servidor al que llegue el cliente, tenga acceso al estado más reciente.

Esto es lo que ambos proporcionan gratuitamente. Úselo para lo que lo necesite y deje de lado las otras características.

Breve resumen del código del blog vinculado

import com.alachisoft.TayzGrid.web.caching.Cache;
    import com.alachisoft.TayzGrid.runtime.*;

    public class MyCachingSample {
        private String url = "dbc:msql://20.200.20.1:1114/MyDatabase";


        public Employee GetEmployee(String empId) throws Exception {
            Employee emp = null;
            try {
                Cache cache = TayzGrid.initializeCache("MyDistributedCache");
                emp = (Employee) cache.get(empId);
                //If key not found in cache, Load from the database
                if (emp == null) {
                    //Your logic goes here
                    ResultSet rs = stmt.executeQuery("SELECT * FROM Employee WHERE EmpId ='" + empId + "'");
                    if (rs.next()) {
                        emp = new Employee();
                        emp.EmpId = rs.getString("EmpId");

                        //Cache key for future use
                        cache.insert(empId, emp, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default);
                    }
                }
            } catch (Exception exp) {
                throw exp;
            }
            //return the required object
            return emp;
        }
    }

Sin embargo, tendrá que escribir un proveedor de sesión simple para admitir sesiones persistentes o puede comprar NCache o TayzGrid para obtener estas funciones. TayzGrid o NCache también se pueden utilizar y se utilizan como una memoria caché distribuida o una cuadrícula de datos en memoria o, a veces, como un almacén de valores clave en memoria. Depende completamente de cuáles sean tus necesidades.

Si necesita soporte o planea usarlo para una empresa, siempre puede obtener las licencias pagas. Es una versión más rica en funciones y proporciona soporte. Tenemos más de 10 años de experiencia en la industria, por lo que es estable para un entorno de producción completo.