2012-09-01 13 views
9

Estoy tratando de convertir un gran directorio de imágenes de alta resolución (varios millones) en miniaturas usando Python. Tengo una tabla DynamoDB que almacena la ubicación de cada imagen en S3.Escribiendo una cola distribuida en DynamoDB de Amazon

En lugar de procesar todas estas imágenes en una instancia de EC2 (tomaría semanas) me gustaría escribir una aplicación distribuida utilizando varias instancias.

¿Qué técnicas podría usar para escribir una cola que permita a un nodo "verificar" una imagen de la base de datos, cambiar su tamaño y actualizar la base de datos con las nuevas dimensiones de las miniaturas generadas?

Específicamente, me preocupan la atomicidad y la concurrencia: ¿cómo puedo evitar que dos nodos examinen el mismo trabajo al mismo tiempo con DynamoDB?

Respuesta

10

Un enfoque que podría tomar sería usar Amazon's Simple Queue Service(SQS) junto con DynamoDB. Entonces, lo que podrías hacer es escribir mensajes en la cola que contengan algo así como la tecla de almohadilla de la entrada de la imagen en DynamoDB. Cada instancia verificaría periódicamente la cola y tomaría los mensajes. Cuando una instancia toma un mensaje de la cola, se vuelve invisible para otras instancias durante un período de tiempo determinado. Luego puede buscar y procesar la imagen y eliminar el mensaje de la cola. Si, por algún motivo, algo va mal con el procesamiento de la imagen, el mensaje no se eliminará y se volverá visible para otras instancias.

Otro enfoque, probablemente más complicado, sería utilizar conditional update mechanism de DynamoDB para implementar un esquema de bloqueo. Por ejemplo, podría agregar algo como un atributo 'beingProcessed' a su modelo de datos, que es 0 o 1. Lo primero que una instancia podría hacer es realizar una actualización condicional en esta columna, cambiando el valor a 1 si el valor inicial es 0. Probablemente hay más por hacer aquí para que sea un mecanismo de bloqueo apropiado/robusto ...

+0

DynamoDB es la herramienta incorrecta para el trabajo. El proceso es muy simple con SQS. 1.DynamoDB = LargeImageLocations> SQS; SQS = Proceso> n * EC2 = Ubicación de la actualización> DynamoDB –

+1

La frase "SQS tiene un mecanismo integrado para evitar que varias instancias lean el mismo mensaje" es un poco engañosa. No hay garantía de "una sola vez". Veo que describes una solución de bloqueo con DynamoDB, pero mejor eliminas la declaración anterior. –

+0

Tenga en cuenta que SQS no es compatible con HIPAA, por lo que lo que sugiere nstehr puede ser una solución muy viable si no se le permite almacenar cierta información en el mensaje SQS. –

2

Usar el bloqueo optimista de DynamoDB con control de versiones permitiría que un nodo "revise" un trabajo actualizando un campo de estado a "En progreso". Si un nodo diferente intentara verificar el mismo trabajo actualizando el campo de estado, recibiría un error y sabría recuperar un trabajo diferente.

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaVersionSupportHLAPI.html

Sé que esto es una cuestión de edad, por lo que esta respuesta es más para la comunidad que el creador original.

+0

El uso de dínamo de esta manera genera problemas si tu proceso muere a mitad de camino y la bandera en progreso nunca se borra. – Chaos

Cuestiones relacionadas