2010-08-07 10 views
21

¿Cuál es la forma recomendada de implementar un mecanismo de bloqueo simple para usar junto con S3?Bloqueo con S3

ejemplo de lo que quiero hacer: Bloqueo

  • adquirir por objeto Identificación
  • objeto de lectura desde S3
  • modificar datos
  • objeto de escritura a S3
  • bloqueo de seguridad de

Lo ideal es que busque un mecanismo de bloqueo basado en la nube. Podría usar memcached localmente, pero luego tengo que lidiar con escalar eso. No veo una forma obvia de implementar el bloqueo liviano con cualquier API de AWS, pero parece ser un problema común.

Me pregunto si podría usar SimpleDB para hacer una operación de adquisición de bloqueo atómico. ¿Alguien ha intentado eso?

Respuesta

10

Ok, he pasado un tiempo esta mañana jugando con boto y creo que tengo una solución que funciona con SimpleDB. Necesita la última versión de Boto para que se admitan las publicaciones condicionales y las lecturas consistentes.

Código de ejemplo aquí: http://pastebin.com/3XzhPqfY

Por favor enviar comentarios y/o sugerencias. Creo que este código debería ser bastante seguro: mi prueba en main() lo prueba con 10 hilos.

Una cosa que no he mencionado es que las lecturas S3 no son consistentes (¿no?), Por lo que en teoría un hilo puede estar funcionando en una copia anterior del valor S3. Parece que puede haber una solución para que tal como se describe aquí:

http://www.shlomoswidler.com/2009/12/read-after-write-consistency-in-amazon.html

+0

SimpleDB parece estar en desuso ahora; se ha caído de la consola de AWS y ya no figura entre sus 'Servicios y Soluciones'. ¿Tienes una implementación que usa DynamoDB? :) – pjz

2

yo no piensa que usted puede hacer esto utilizando S3 solamente, está utilizando mejoras consistencia de SimpleDB como dijo James una buena manera de que funcione

puede buscar algunos ejemplos aquí: Amazon SimpleDB Consistency Enhancements

otro enfoque que podría estar bien está utilizando la versioning feature de S3
lo que, básicamente, almacenar un par Identificación del objeto Identificación/versión en SimpleDB como el más "válida" Versi en
y asegurar que todas las peticiones GET recuperará esa versión
después de un PUT con éxito de un objeto modificado, actualizar la versión id en la base de datos

esta manera también se puede utilizar la capacidad de recuperar versiones anteriores de un objeto para la restauración si es necesario.