2011-09-29 25 views
6

Ya he tenido experiencias con MongoDB, CouchDB, Redis, Tokyo Cabinet y otras bases de datos NoSQL. Recientemente me encontré con Riak y me parece muy interesante. Para empezar, decidí escribir un pequeño clon de twitter, el "mundo de hola" en NoSQL World. Para obtener un clon completamente funcional, es necesario ordenar los tweets cronológicamente. Después de leer los documentos de Riak, descubrí que Map-Reduce es la herramienta adecuada para este trabajo. En mi entorno de desarrollo funciona bastante bien, pero ¿cómo está el rendimiento en producción, con cientos de consultas paralelas? ¿Existen otros métodos, quizás más rápidos, para clasificar datos, o es posible almacenar los datos en forma ordenada (como Cassandra)?¿Cómo ordenar/ordenar datos en Riak?

Actualización: Creo que he encontrado otra solución a este problema: una simple lista vinculada. Entonces, una posible implementación podría ser que cada usuario obtenga su propio "espacio de tiempo", donde los enlaces a los tweets-datos se almacenan (los tweets se almacenan por separado en el contenedor "tweets"). Como sabría, esta línea de tiempo-cubo debe contener una clave llamada "primero", que se vincula con el último objeto línea de tiempo y es el punto de partida de la lista. Para insertar un nuevo tweet en la línea de tiempo, simplemente inserte un nuevo elemento en el cubo de la línea de tiempo, establezca el "siguiente" enlace de este nuevo elemento al "primer" elemento, luego de eso, haga que el nuevo elemento sea "primero".

En resumen: insertar un elemento como lo haría en una lista enlazada ...

Como con twitter, la línea de tiempo personal, sólo tiene capacidad para 20 tuits que se muestran al usuario. Para recibir los últimos 20 tweets, solo hay 2 consultas necesarias. Para acelerar las cosas, la primera consulta utiliza la capacidad de enlace de Riak para obtener los últimos 20 objetos, etiquetados por "siguiente". Finalmente, la segunda y última consulta utiliza las claves calculadas por la primera consulta para recibir los tweets en sí (usando map/reduce).

Para eliminar los tweets de los usuarios que acaba de seguir, usaría la capacidad de índice secundaria de Riak 1.0 para recibir los objetos de línea de tiempo relacionados/tweets.

+0

Desde Riak 1,4 clasificación y paginación está disponible con índices secundarios: http://basho.com/basho-announces-availability-of-riak-1-4/ – nacmartin

Respuesta

2

No es posible almacenar datos de forma ordenada en Riak sin recurrir a la reescritura de partes del núcleo de Riak. Los datos se almacenan, más o menos, en el orden cubo + clave. El orden real depende del mecanismo de almacenamiento de back-end que está utilizando para Riak.

Riak 1.0 tiene algunas características que pueden ayudarle también. Hay soporte para índices secundarios así como para mejoras en las operaciones de Map Reduce, en particular, funcionan mucho mejor en escenarios altamente concurrentes.

Alexander Siculars ha escrito un artículo sobre Pagination with Riak. Resume el problema bastante bien. Yammer también hizo un uso extensivo de Riak y dos de sus ingenieros prepararon una presentación sobre Riak at Yammer. No entra en muchos detalles de implementación, pero puede aprender mucho sobre cómo han diseñado su solución.

La combinación de consultas de índices secundarias y Map Reduce hace que sea posible resolver su problema muy fácilmente.

0

Como Jeremiah dice que no es posible almacenar los datos en orden, pero aún puede hacer que devuelva resultados ordenados mediante índices secundarios y mapa/reducir. El problema, tal como se describe, es que no puede limitar eficientemente la consulta de una manera ordenada.

Aquí hay un ejemplo usando consulta gama para listar todas las teclas y luego ordenarlos utilizando el construido en funciones en riak_kv_mapreduce * * ::

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087), 
riakc_pb_socket:mapred(Pid            
    , {index, colonel_riak:bucket(context), <<"$key">>, <<0>>, <<255>>}  
    , [{reduce, {modfun, riak_kv_mapreduce, reduce_sort}, none, true}]) 

Puede utilizar las funciones en el módulo lists en Erlang o utilizar el función de clasificación nativa de javascript. El pedido puede realizarse por lists:reverse/1 en erlang.

Cuestiones relacionadas