2012-02-20 29 views
21

Estaba considerando utilizar Amazon DynamoDB en mi aplicación, y tengo una pregunta con respecto a su fiabilidad atomic counters.Contadores atómicos en DynamoDB

Estoy construyendo una aplicación distribuida que necesita simultáneamente, y consistentemente, incrementar/decrementar un contador almacenado en el atributo de una dinamo. Me preguntaba qué tan confiable es el contador atómico del Dynamo en un entorno concurrente pesado, donde el nivel de concurrencia es extremadamente alto (digamos, por ejemplo, una tasa promedio de 20k hits concurrentes - para obtener la idea, eso sería casi 52 mil millones incrementos/decrementos por mes).

El contador debe ser muy confiable y nunca se pierda un golpe. ¿Alguien ha probado DynamoDB en entornos tan críticos?

Gracias

Respuesta

16

DynamoDB lo consigue es escalar propiedades mediante el fraccionamiento de las claves a través de múltiples servidores. Esto es similar a otras bases de datos distribuidas como Cassandra y HBase. Mientras que puede aumentar el rendimiento en DynamoDB que solo mueve sus datos a varios servidores y ahora cada servidor puede manejar conexiones concurrentes totales/cantidad de servidores. Consulte sus preguntas frecuentes para obtener una explicación sobre cómo lograr el máximo rendimiento (http://aws.amazon.com/dynamodb/faqs/#Will_I_always_be_able_to_achieve_my_level_of_provisioned_throughput)

Esto significa que tener una clave que se incrementa directamente no se escalará ya que esa clave debe residir en un servidor. Hay otras maneras de manejar este problema, por ejemplo en la agregación de memoria con un incremento de descarga a DynamoDB (aunque esto puede tener problemas de confiabilidad) o un contador fragmentado donde los incrementos se reparten entre varias claves y se vuelven a leer al tirar de todas las claves contador (http://whynosql.com/scaling-distributed-counters/).

+2

Lamentablemente link rot se ha establecido para esta respuesta en el segundo enlace – Luke

8

Además de la respuesta de gigq por la escalabilidad, DynamoDBs incrementos atómicos no son idempotente y por lo tanto no son fiables: Si la conexión se interrumpe después de emitir una solicitud UpdateItemADD, que no hay manera de saber si el complemento se cometió o no, por lo no sabes si debes volver a intentarlo o no.

Las actualizaciones condicionales de DynamoDB solucionan esto, a costa de hacer que el sistema sea aún menos escalable, porque debe volver a intentarlo cada vez que se intentan dos cambios simultáneamente, incluso en ausencia de un error.

+0

Las actualizaciones condicionales de DynamoDB corrigen esto, no realmente: si el cliente tiene un error de red cuando se aplicó la escritura pero antes de saberlo, ¿qué debería hacer el cliente? ? – aaaristo

+0

Los documentos dicen que debe volver a intentarlo porque las actualizaciones condicionales son idempotentes, pero no estoy de acuerdo. P.ej. el cliente lee un contador, su valor es 10 y debe incrementarse en 1. Realiza la primera llamada: establece el contador en 11 si su valor es 10. La actualización se ejecuta y la conexión se interrumpe. El cliente detecta la excepción de red y vuelve a intentar: la condición es falsa. Entonces el cliente no sabe si debería intentar aumentar en 1 de 11 o no: el problema es que ** si se produce un error de red, el cliente no tiene manera de distinguir entre su propio incremento y un incremento realizado por otros al mismo tiempo * * – collimarco

+0

¿Qué sucede si utilizó los 'ReturnValues' de la declaración de actualización? De esta forma, obtienes el valor una vez que se realizó la actualización. El valor de retorno es muy consistente. Entonces no necesita leer, y luego actualizar. Si su red se cae, vuelva a intentarlo. El peor caso es que omitas un número en la secuencia. http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#DDB-UpdateItem-request-ReturnValues – blo0p3r