desventajas - ¿Equivalente de un ORM para un almacén de clave/valor distribuido?
riak ventajas y desventajas (2)
Estoy en el proceso de evaluar cómo implementar algo usando 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.
¿Alguien puede señalarme algún ejemplo de otras personas haciendo 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.
Anteriormente utilizamos Riak para hacer algo similar, utilizando el Ripple de cliente 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 omitir 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 el PBC en lugar de la interfaz HTTP, pero esa es otra historia: D), así es como 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.
Use enlaces de Riak para unir objetos, no almacene claves externas en el documento. Tenga en cuenta que hay un límite en la cantidad de enlaces que puede almacenar en un objeto, así que no se vuelva loco con ellos (por ejemplo, almacenar un enlace para cada comentario en el objeto del usuario).
Ripple (y Riak) no son compatibles con los índices, por lo que tuvimos que implementar 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''.
Es posible que también desee estudiar el uso del filtrado de claves . 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''.
Realmente no deberías necesitar mucha capa, si es que hay alguna, para esto.
Es un almacén de clave / valor por el bien de Pete, use cualquier 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 están tratando con un modelo relacional en un lado. Un almacén de valores clave, bueno, no.