Mi granito de java: ¿Cual es el mejor Java Cache?

jueves, 16 de junio de 2011

¿Cual es el mejor Java Cache?

Para hacerla corta...Infinispan. Para hacerla larga y ver que pruebas hicimos para sacar esa conclusión, leer lo que sigue a continuación.

Hemos realizado diverso tipos de pruebas con los caches más conocidos para que se tenga una mejor visión a la hora de seleccionar una alternativa.

Algunas de las siguientes pruebas se realizaron con el framework CacheBenchFwk en su version 1.0.0 y otras se hicieron con una aplicación desarrollada especialmente para estas pruebas, para poder tener una vista mas detallada sobre las ventajas de esta herramienta.

Las pruebas con el CacheBenchFwk las hemos realizado con las siguientes herramientas:
  • Infinispan 4.0.0
  • Jboss Cache 3.2.2GA
  • EHCache 1.7.2
Y las pruebas desarrolladas por nosotros las hicimos con las siguientes librerías en su versión FINAL:
  • Infinispan 4.1.0
  • Jboss Cache 3.2.5GA
  • EHCache 2.2.0


Las pruebas fueron realizadas con las siguiente configuracion:
  • Linux Ubuntu 10.04
  • Total memoria RAM: 4 Gigas.
  • Procesador: 4 procesadores Intel Atom 330 1.6 Ghz.
  • JDK version "1.6.0_20" 64-Bit con los parametros -Xms1g -Xmx1g
  • CacheBenchFwk 1.0.0
  • Pruebas en modo standalone con 25 concurrencias usando Strings generados aleatoriamente tanto para valores como para las claves generando 1 kb de carga por cada entrada.
  • Las pruebas no locales fueron hechas en una red local con 3 nodos de iguales características a las descriptas anteriormente.
  • Configuraciones de las distintas tecnologias estan por default. 


Pruebas locales.

En los siguientes graficos de performance se ven dos barras verticales para Infinispan como para JbossCache. Cada una se corresponde con un tipo de Isolation level Read Commited y Repeatable Read.

1) Pruebas de Stress
Carga de datos


Lectura de datos

2) Pruebas de escritura y lectura simples

Los tiempos son tan bajos que Infinispan no aparece en la grafica.

Como se puede apreciar en los graficos anteriores Infinispan es superior a Jboss Cache y EHCache, obteniendo los tiempos mas bajos tanto en escritura como lectura de datos.

En el caso de la pruebas de stress, estan fueron hechas con los distintos caches como si funcionaran unicamente en un servidor dedicado exclusivamente para cache. Si bien la tecnologia con la que se hicieron las pruebas no son las de un servidor, son aproximados los resultados. Las pruebas de stress demuestran que en el caso de que se quiera montar un servidor para uso exclusivo de cache Infinispan es una excelente opción, ya que en la pruebas se uso concurrencia simulando las distintas peticiones que se pueden realizar. Estas pruebas se realizaron como unico nodo, pero Infinispan se puede usar en modo cluster lo cual permitiria una mayor disponibilidad de datos y ser escalable, pudiendo elegir el modo en que se repliquen los datos(en cada nodo una copia o una parte de esta).

Por otro lado las pruebas simples fueron hechas con una aplicación simple desarrollada por Guillermo y por mí para demostrar la performance de cada cache en un modo de uso local contra una aplicación. Las pruebas, como se ve en los graficos, volvieron a dar a Infinispan como el más rapido. Estos resultados por ejemplo nos sirven a la hora de decidir con que cache de segundo nivel poner a funcionar Hibernate.



Pruebas no locales.

Dado que Infinispan fue un amplio ganador con respecto al resto, decidimos ampliar sus pruebas y realizar un testeo con varios nodos en red para ver si decrecía su rendimiento de alguna manera. Estas pruebas tuvieron las siguientes características:
  • Las pruebas se realizaron el con el cliente Hot Rod y en modo embebido, debido a que son las dos mejores maneras de usar Infinispan en un entorno con Java.
  • Para funcionar en modo cluster Infinispan usa Jgroups con las configuraciones TCP como para UDP.

Vamos a hacer una breve explicación de los dos modos:
1) Modo embebido.

La configuración en este modo es secilla, puede ser declarativa o programatica. Con esto podemos levantar varios nodos, pero en cada uno de estos debemos poner nuestra aplicación con Infinispan embebido. Si bien la configuracion es sencilla esto tiene desventajas:

  • Alto consumo de recursos.
  • Tiempo en inicializar Infinispan depende de la cantidad de datos que maneje el cache en ese momento.
  • Bloqueo de acceso al resto de las instancias al agregar nuevos nodos, debido que estos son lentos en levantar.
  • Para agregar un nuevo nodo debo deployar la aplicación en este.


2) Hot Rod Client
Esta manera de utilizar Infinispan resulta mas sencilla, rapido y performante que la embebida. Lo que se hizo fue levantar los nodos de la siguiente manera:

./startServer.sh -r hotrod -l 192.168.254.66 -c config.xml -p 11311 -o 192.168.254.66 -x 11311


Una vez con todos los nodos levantados, estos ya se estaban mandando mensajes entre sí. Luego levantamos la aplicación configurando la ip de un solo nodo y enseguida reconocio el resto y creo un pool de conexiones para cada uno. El codigo usado fue el siguiente:




Las pruebas con este cliente fueron mas que satisfactorias, ya que el cliente detectaba cuando se agregaba un nodo o se bajaba uno del cluster. Esto no afectaba a su performance. Si bien este cliente hay algunas operaciones que no soporta como las queries sobre el cache su manejo del cluster compensa.

¿Que aprendimos de las pruebas realizadas?


Al realizar las pruebas en modo embebido y con el cliente Hot Rod, se recomienda ampliamente el uso del cliente Hot Rod en un entorno Java, ya que este maneja de manera mas eficiente el cluster:
  • Detecta automáticamente cambios en la topología del cluster.
  • Al agregar nuevos nodos resulta es más rapido con el cliente Hot Rod que de manera embebida.
  • Usa lo que se llama smart routing para mayor velocidad de respuesta.
  • Se puede controlar el pool de conexiones con el cluster.
  • Al levantar el cliente este empieza a detectar los posibles nodos del cluster en la red local.
  • Muy configurable.

Conclusión.

Infinispan es un producto opensource de JBoss y se ha nutrido de la experiencia de Jboss Cache (una librería). Es una solución que nos permite crear enormes estructuras de datos distribuidas y altamente concurrentes almacenadas en la memoria RAM de múltiples nodos de un cluster.

Hemos podido observar que Infinispan es altamenta escalable, configurable y sencilla de utilizar. Asimismo, su rendimiento suele ser superior en casi todos los aspectos con respecto a sus competidores.

Infinispan no presentó problemas para realizar pruebas en máquinas distribuídas y su velicidad se ha mantenido constante en las diversas pruebas. Es un producto áltamente recomendable.

Este post es una adaptación de un informe que hice junto a Guillermo Kessler

3 comentarios:

LuZcila dijo...

¡Muy buen informe, muy útil!
¡Muchas gracias!

Max dijo...

Muchas gracias!

Sergio dijo...

Excelente informe!
Muchas gracias por la información, muy agradecido.