2012-09-08 11 views
5

Parece que no puedes hacer transacciones en riak. ¿Cómo se puede asegurar que los datos sean correctos?Asegurar la corrección en riak?

Digamos que queremos insertar un comentario. En Redis que haría

commentId=incr commentCount 
multi 
SET comment_post:commentId postId //for later use when we flag comments. We'll need to know where in the db it is 
RPUSH post_comment:postId binaryValue //contains commentId in it + comment body 
exec 

en SQL que había insertar una nueva fila en una tabla comentario con el texto y post ID. Ambos usan más de una declaración. ¿Cómo inserto el cuerpo del comentario y asocio la publicación al comentario en riak ya que no tiene transacciones?

Otro problema es si modifico una publicación. ¿Cómo actualizo la publicación y actualizo la lista de etiquetas de publicación usando esa etiqueta?

Respuesta

6

Riak es un sistema eventualmente consistente diseñado para ser escrito disponible y no tiene ningún concepto de atomicidad; no hay contadores atómicos ni transacciones .

Edit: Publicamos contadores utilizando CRDT en Riak 1.4. Para obtener detalles, consulte Counters in Riak 1.4

El enfoque utilizado por Riak se basa en el documento Amazon Dynamo y utiliza relojes vectoriales para la resolución de conflictos; es un ciclo de lectura/modificación/escritura con cualquier resolución de conflicto realizada durante una lectura posterior. En cualquier momento dado, puede tener múltiples valores para una clave determinada que se devolverán al hacer una búsqueda.

que suena como si desea buscar en nuestra secondary indexes (si estoy comprensión de su situación; el hecho de que se necesita una nueva commentId para un 'como' es algo confuso sin saber más). Crearías un índice secundario que apuntara a tu cuerpo de comentario que se envía junto con el cuerpo mismo cuando haces una tienda. Eso resuelve al menos la mitad del problema.

Cómo obtener su commentId es un poco más complicado. No puedes usar un contador atómico global porque no los tenemos. Su diseño necesitaría ya sea no confiar en identificadores secuenciales (¿quizás generar UUID?) Y quizás usar nuestro links?

Si le interesa y desea hablar sobre posibles enfoques de diseño, por favor contáctenos en el riak-users mailing list, todos nuestros ingenieros lo leen y siempre estarán encantados de responder sus preguntas.

+0

No sé mucho sobre riak ya que lo eché un breve vistazo. Cuando sepa los conceptos básicos o más, los publicaré allí, pero no ahora. Quiero obtener una idea general de lo que es adecuado, ya que descubrí que redis es malo para ser un DB, ya que tiene que ser capaz de encajar todo en la memoria. No sé nada sobre 'relojes vectoriales', pero acabas de decir que puedo tener múltiples valores para una clave que suena raro, pero pretenderé que riak es bastante eficiente. ¿Entonces riak está diseñado para tener toda la lógica de consistencia hecha por la aplicación? Eso es interesante –

+0

. Leí un poco. Estoy un poco confundido porque el ejemplo muestra que se establece allow_mult en verdadero. Entonces, ¿qué pasa si tengo algo que tiene un conflicto de escritura y es falso ... Entonces, parece que todo tiene un vclock en él? Parece que estás escribiendo alto. Puedo ver el uso y la compensación allí. Me puedo imaginar cómo resolver y corregir cosas para mis necesidades, pero no puedo imaginar/pensar en lo que sucede si no configuró multis y es falso? ¿Uno sobrescribirá al otro? ¿Fallará? Puedo ver cómo manejar las cosas si falla (pero tendré que deshacer otras escrituras) –

+0

, pero no puedo ver qué sucede si no falla y un trabajo finalizó mientras el otro trabajo comenzó y terminó un poco después y sobreescribió datos . –

Cuestiones relacionadas