Existen muchas herramientas y métodos diversos, pero creo que ninguno de ellos puede brillar en todos los requisitos.
Para baja latencia, sólo se puede confiar en el acceso de datos en memoria - discos son físicamente demasiado lento (y los SSD también). Si los datos no caben en la memoria de una sola máquina, tenemos que distribuir nuestros datos a más nodos sumando suficiente memoria.
Para persistencia, tenemos que escribir nuestros datos en el disco después de todo. Suponiendo una organización óptima , esto se puede hacer como actividad de fondo, sin afectar la latencia. Sin embargo, para fiabilidad (failover, HA o lo que sea), las operaciones del disco no pueden ser totalmente independientes de los métodos de acceso: tenemos que esperar a que los discos modifiquen los datos para hacer que nuestra operación no desaparezca. Concurrencia también agrega cierta complejidad y latencia.
El modelo de datos no es restrictivo aquí: la mayoría de los métodos admiten el acceso basado en una clave única.
Tenemos que decidir,
- si los datos se ajusta en la memoria de una máquina, o tenemos que encontrar soluciones distribuidas,
- si la concurrencia es un problema, o no hay operaciones en paralelo,
- si la fiabilidad es estricta, no podemos perder modificaciones, o podemos vivir con el hecho de que un bloqueo no planificado daría lugar a la pérdida de datos.
Las soluciones pueden ser
- auto implementado estructuras de datos usando la biblioteca estándar de Java, archivos, etc., no pueden ser la mejor solución, porque la fiabilidad y baja latencia requieren implementaciones inteligentes y un montón de pruebas,
- RDBMS tradicionales s tienen un modelo flexible de datos, operaciones duraderas, atómicas y aisladas, almacenamiento en caché, etc. - en realidad saben demasiado y son en su mayoría difíciles de distribuir. Es por eso que son demasiado lentas, si no puede desactivar las características no deseadas, que generalmente es el caso.
- NoSQL y tiendas de valores-clave son buenas alternativas. Estos términos son bastante vagos y cubren muchas herramientas. Los ejemplos son
- BerkeleyDB o Kyoto Cabinet como almacenes de valores-clave persistentes de una máquina (usando B-trees): se pueden usar si el conjunto de datos es lo suficientemente pequeño para caber en la memoria de una máquina.
- Proyecto Voldemort como una tienda de valores-clave distribuida: utiliza BerkeleyDB java edition inside, simple y distribuido,
- ScalienDB como almacén de clave-valor distribuido: confiable, pero no demasiado lento para las escrituras.
- MemcacheDB, Redis otras bases de datos de almacenamiento en caché con persistencia,
- sistemas populares NoSQL como Cassandra, CouchDB, HBase, etc.: se utiliza principalmente para big data.
Una lista de herramientas NoSQL se puede encontrar por ejemplo. here.
Voldemort's performance tests reportan tiempos de respuesta de menos de milisegundos, y estos se pueden lograr bastante fácilmente, sin embargo, también debemos tener cuidado con el hardware (como las propiedades de red mencionadas anteriormente).
¿Qué quieres decir con "Extremadamente rápido"? –
Latencia de sub milisegundos para almacenar y recuperar – AAK
¿cuál es su relación de escrituras a lecturas? al leer, ¿cuál es el patrón de acceso (aleatorio, agrupado, ...)? ¿Cuál es la naturaleza de la clave única para cada registro (no importa, uuid, timestamp)? – Ron