Llevaba ya algún tiempo queriendo hacer algunas pruebas de una base
de datos nosql, desde dos puntos de vista:
- Modelo de desarrollo
- Rendimiento
Después de leer algunos
artículos he seleccionado la siguiente, «mongodb», ya que me
parece que está muy avanzada desde el punto de vista del
desarrollador. Es decir admite un lenguaje de query bastante amplio y
en vez de usar un modelo de acceso basado en REST, como
por ejemplo couchdb, usa drivers nativos para los distintos
lenguajes. No he realizado pruebas de rendimiento, propiamente dichas,
así que no he seleccionado mongobd por que sea más o menos rápida que
otras. La idea de esta prueba es ver que se puede hacer con una base
de datos nosql más que analizar cual da más o menos rendimiento
Una vez seleccionado un motor el ejercicio que me he planteado
es el siguiente
crear una aplicación web que permita realizar búsquedas sobre
una conjunto de trazas de una servidor. Dispongo de
un fichero de texto con medio millón de lineas, cada
linea representa un acceso a una método de una aplicación y cada linea
tiene al menos:
- Id de la linea, un string
- Operación que se invoca, un string
- Duración de la misma, un long
- La hora a la que se realizó, un date
- Estatus de la petición, un integer
- Cabeceras de la petición, pude tener más de una, list
- Cabeceras de la respuesta, pude tener más de una, list
Lo primero que he hecho ha sido instalar
el motor de base de datos, aptitude install mongo…. sencillo.
Lo segundo es crear el modelo que representa los
objetos que voy a utilizar, en este caso TrazaItem,
ResponseHeader y RequestHeader. Cada uno de estos tres
elementos estará representado por un bean de java.
Lo tercero es crear una mapeador que me transforme
las lineas del fichero en objetos TrazaItem
Una vez hecho esto se puede volcar la información en la
colección de mongodb. Tarda unos 4 minutos
en procesar el medio millon de registros e
insertarlos en la colección.
Como cuarto paso vamos a crear un servlet, un
jsp y una clase de búsqueda. En el servlet recogeremos los
valores de los filtros y en la clase de búsqueda procesaremos la
información para mostrarla en el jsp
Una vez desplegada la aplicación en el tomcat podemos ver
que el modelo es realmente rápido y muy flexible. Todas las
peticiones tardan menos de 1,5 segundos en procesarse con
ordenaciones, filtrados etc…
Por tanto las conclusiones rápidas, que no
tiene porque ser acertadas ya que se han invertido unas 10
horas en hacer todas las tareas, son:
- Si el modelo de backend de tu aplicación es un modelo
desnormalizado, las bases de datos NOSQL puede ser de gran ayuda - Si el modelo a representar es jerárquico, las bases de datos
NOSQL pueden ser interesantes - Mongobd
permite hacer queries sobre los objetos internos de la colección - Mongodb + una librería de JSON, como flexjson permiten un
mapeo eficiente de los objetos almacenados en la base de datos NOSQL
agilizando el desarrollo. - Mongodb permite realizar ordenaciones, counts, limits de manera
nativa y permite usar MAP/REDUCE para
hacer agrupaciones, por ejemplo. - Si tu modelo es de tipo E-R este tipo de bases de datos no son
interesantes porque tendrás que implementar las relaciones - Los siguientes ejemplos/patrones hay que
tenerlos en cuenta a la hora de decidir si se usa o no, una base de
datos de este tipo. - Supongo que cualquier otra base de datos NOSQL ofrecerá
características similares a la analizada en este caso. - Faltaría analizar el rendimiento del MAP/REDUCE, como crear
índices etc.. de este y otros motores. - Exiten una gran variedad de productos que
ofrecen caracaterísticas similares y no tengo claras las diferencias
entre los mismos.
A continuación una imagen de como ha quedado la aplicación ….