2012-09-01 13 views
9

Sto cercando di convertire una grande directory di immagini ad alta risoluzione (diversi milioni) in miniature usando Python. Ho una tabella DynamoDB che memorizza la posizione di ogni immagine in S3.Scrivere una coda distribuita in DynamoDB di Amazon

Invece di elaborare tutte queste immagini su un'istanza EC2 (ci vorranno settimane) mi piacerebbe scrivere un'applicazione distribuita utilizzando un gruppo di istanze.

Quali tecniche è possibile utilizzare per scrivere una coda che consentirebbe a un nodo di "estrarre" un'immagine dal database, ridimensionarla e aggiornare il database con le nuove dimensioni delle anteprime generate?

In particolare sono preoccupato per l'atomicità e la concorrenza - come impedire a due nodi di eseguire contemporaneamente lo stesso lavoro con DynamoDB?

risposta

10

Un approccio che potreste adottare sarebbe quello di utilizzare Amazon's Simple Queue Service(SQS) insieme a DynamoDB. Quindi quello che potresti fare è scrivere messaggi in coda che contengono qualcosa come la chiave hash della voce immagine in DynamoDB. Ogni istanza controllerebbe periodicamente la coda e interrompe i messaggi. Quando un'istanza afferra un messaggio dalla coda, diventa invisibile ad altre istanze per un dato periodo di tempo. È quindi possibile cercare ed elaborare l'immagine ed eliminare il messaggio dalla coda. Se per qualche motivo qualcosa va storto con l'elaborazione dell'immagine, il messaggio non verrà eliminato e diventerà visibile per altre istanze da afferrare.

Un altro, probabilmente più complicato, sarebbe l'utilizzo di DynamoDB conditional update mechanism per implementare uno schema di blocco. Ad esempio, potresti aggiungere qualcosa all'attributo 'beingProcessed' nel tuo modello di dati, ovvero 0 o 1. La prima cosa che un'istanza potrebbe fare è eseguire un aggiornamento condizionale su questa colonna, cambiando il valore su 1 se il valore iniziale è 0. Probabilmente c'è ancora molto da fare qui intorno a renderlo un meccanismo di bloccaggio adeguato/robusto ...

+0

DynamoDB è lo strumento sbagliato per il lavoro. Il processo è molto semplice con SQS. 1.DynamoDB = LargeImageLocations> SQS; SQS = Processo> n * EC2 = UpdateLocation> DynamoDB –

+1

La frase "SQS ha un meccanismo incorporato per impedire a più istanze di leggere lo stesso messaggio" è un po 'fuorviante. Non esiste una garanzia "una sola volta". Vedo che descrivi una soluzione di chiusura con DynamoDB, ma rimuovi la dichiarazione precedente. –

+0

Si noti che SQS non è conforme a HIPAA, quindi quello che nstehr suggerisce potrebbe essere una soluzione molto valida se non si è autorizzati a memorizzare determinate informazioni nel messaggio SQS stesso. –

2

L'utilizzo del blocco ottimistico di DynamoDB con il controllo delle versioni consentirebbe a un nodo di "estrarre" un lavoro aggiornando un campo di stato a "InProgress". Se un nodo diverso ha provato a verificare lo stesso lavoro aggiornando il campo dello stato, riceverebbe un errore e sarebbe in grado di recuperare un altro lavoro.

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

So che questa è una vecchia questione, in modo da questa risposta è più per la comunità che il manifesto originale.

+0

L'uso della dinamo in questo modo porta a problemi se il tuo processo muore a metà strada e il flag in corso non viene mai cancellato. – Chaos