2011-04-11 11 views
5

Estoy en el proceso de evaluar cómo implementar algo utilizando un almacén distribuido de claves/valores para el back-end. Me gustaría tener una capa sobre la clave/valor que soporta un modelo de objetos que sea similar a lo que obtendría de un mapeador relacional de objetos.¿Equivalente de un ORM para un almacén de clave/valor distribuido?

¿Alguien me puede indicar ejemplos de otras personas que hacen esto? Principalmente estoy buscando ideas de diseño, aunque si encuentro algo que me gusta lo suficiente, puedo usarlo en lugar de escribir el mío. Probablemente voy a terminar implementando el mío en Perl encima de Riak, pero esas decisiones no son definitivas.

Respuesta

4

Anteriormente utilizamos Riak para hacer algo similar, utilizando el Ripple de cliente de Ruby que expone una interfaz AciveModel. Sin embargo, realmente tengo que desaconsejarlo (como lo han hecho otros). Usando un ORM pesado encima de un almacén de claves/valores, realmente se pierde su principal ventaja, que es la velocidad.

Ahora nos estamos moviendo hacia saltar Ripple y hablar directamente con Riak para un montón de cosas conscientes de la velocidad (también nos estamos moviendo a Erlang y usando PBC en lugar de interfaz HTTP, pero esa es otra historia: D), así es cómo lo hacemos:

  • En nuestros objetos almacenamos un documento JSON, en un formato compatible con Ripple. Aunque tenemos un requisito de esto ya que aún usamos Ripple para algunas cosas, si tuviera que hacer esto de nuevo sin Ripple, probablemente usaría este formato.

  • Utilice los enlaces de Riak para unir objetos, no almacene claves externas en el documento. Tenga en cuenta que existe un límite en la cantidad de enlaces que puede almacenar en un objeto, así que no se vuelva loco con ellos (por ejemplo, guardando un enlace para cada comentario sobre el objeto del usuario).

  • Ripple (y Riak) no es compatible con los índices, por lo que tuvimos que rodar nuestra propia solución. Como ejemplo, almacenamos un objeto de usuario con una clave generada aleatoriamente, 'fen2nf4j9fecd' en el cubo 'usuarios'. También almacenamos un objeto con la clave 'tom' en el depósito 'users_index_by_username' con un enlace de Riak al objeto en el 'cubo de usuarios'. De esta forma, podemos encontrar fácilmente qué usuario tiene el nombre de usuario 'tom'.

También puede que desee ver en el uso de key filtering. Todavía no jugué con eso, sin embargo, he visto cifras de rendimiento que se ven bastante bien. Debe tener cuidado con Riak para no enumerar las claves de un depósito ya que debido a la forma en que se implementa, Riak busca todas las claves, no solo las claves de ese cubo.

Riak es una gran bestia, sin embargo, una vez que lo entiendas, te encantará. Hace la replicación sin esfuerzo, y 'solo funciona'.

+0

En mi investigación, me he dado cuenta de muchas de las mismas cosas. Estoy al tanto de Riak Search, pero es un poco demasiado beta para mí. No estaba * consciente * de un límite en la cantidad de enlaces, es decir, buena información. Llegué a la misma conclusión acerca de rodar nuestros propios índices. Todavía estoy tratando de descubrir cómo evitar posibles condiciones de carrera. – btilly

+0

Creo que el límite en el número de enlaces solo ocurre si se usa la interfaz HTTP, ya que hay un límite en el tamaño total de los encabezados. No soy 100% sin embargo. También mencioné el producto incorrecto, me refería al filtrado de claves, no a la búsqueda de riak (editada). –

1

En realidad, no se necesita mucha capa para esto.

Es un almacén de claves/valores por el bien de todos, use el mecanismo de serialización que exista en su idioma para convertir desde y hacia su objeto tipeado al objeto del servidor. ¿Que más hay que hacer?

Los ORM son mucho más complicados porque se trata de un modelo relacional por un lado. Un almacén de valores clave, bueno, no.

+0

Eso estaría bien si está dispuesto a almacenar un objeto y todos los objetos secundarios posibles en un par clave/valor, y luego tiene que serializar y deserializar el monstruo completo para cada solicitud. No estoy bien con eso. Si un objeto se refiere a múltiples objetos secundarios, quiero que los diversos objetos y sus relaciones se almacenen en múltiples pares clave/valor que deben mantenerse sincronizados.Evitar repetir esa lógica requiere una capa de abstracción construida sobre la clave/almacén de valores. – btilly

+1

decir que? "Quiero que los diversos objetos y sus relaciones se almacenen en múltiples pares clave/valor que deben mantenerse sincronizados": se llama una Base de datos relacional. No cree un RDBMS en la parte superior de una tienda KV No SQL, solo use el tipo correcto de motor de almacenamiento. –

+0

Estoy muy familiarizado con lo que es una base de datos relacional. Si hubiera una base de datos relacional que fuera horizontalmente escalable sin una base de datos maestra especificada, estaría usando eso en su lugar. Pero no las hay, así que necesito crear el modelo de objetos que quiero encima de una tienda KV NoSQL. – btilly

Cuestiones relacionadas