2012-09-01 10 views
9

Szukam przekształcenia dużego katalogu obrazów wysokiej rozdzielczości (kilka milionów) w miniatury za pomocą Pythona. Mam tabelę DynamoDB, która przechowuje położenie każdego obrazu w S3.Pisanie rozproszonej kolejki w dynamoDB firmy Amazon

Zamiast przetwarzania wszystkich tych obrazów w jednej instancji EC2 (zajęłoby to tygodnie), chciałbym napisać aplikację rozproszoną za pomocą kilku instancji.

Jakich technik można użyć do napisania kolejki, która pozwoliłaby węzłowi "sprawdzić" obraz z bazy danych, zmienić jego rozmiar i zaktualizować bazę danych o nowe wymiary wygenerowanych miniatur?

W szczególności martwię się o atomowość i współbieżność - w jaki sposób mogę uniemożliwić dwóm węzłom jednoczesne sprawdzanie tej samej pracy z DynamoDB?

Odpowiedz

10

Jednym z podejść, które można zastosować byłoby użycie Amazon's Simple Queue Service(SQS) w połączeniu z DynamoDB. Możesz więc napisać komunikaty do kolejki, które zawierają coś takiego jak klucz hashowania wpisu obrazu w DynamoDB. Każda instancja okresowo sprawdzałaby kolejkę i wyłączała komunikaty. Gdy instancja pobiera komunikat z kolejki, staje się niewidoczna dla innych instancji przez określony czas. Następnie można wyszukać i przetworzyć obraz i usunąć wiadomość z kolejki. Jeśli z jakiegoś powodu coś pójdzie nie tak z przetwarzaniem obrazu, wiadomość nie zostanie usunięta i stanie się widoczna dla innych instancji do przechwycenia.

Innym, prawdopodobnie bardziej skomplikowanym, podejściem byłoby zastosowanie programu DynamoDB conditional update mechanism do wdrożenia schematu blokowania. Na przykład możesz dodać coś do atrybutu "beingProcessed" do swojego modelu danych, czyli 0 lub 1. Pierwszą rzeczą, jaką może zrobić instancja, jest wykonanie warunkowej aktualizacji tej kolumny, zmieniając wartość na 1 iff. 0. Prawdopodobnie jest tu więcej do zrobienia, jeśli chodzi o poprawny/solidny mechanizm blokowania ...

+0

DynamoDB to niewłaściwe narzędzie do pracy. Proces jest bardzo prosty w/SQS. 1.DynamoDB = LargeImageLocations> SQS; SQS = Proces> n * EC2 = UpdateLocation> DynamoDB –

+1

Zdanie "SQS ma wbudowany mechanizm zapobiegający wielokrotnemu odczytywaniu tego samego komunikatu" jest nieco mylące. Nie ma gwarancji "tylko raz". Widzę, że opisujesz rozwiązanie blokujące z DynamoDB, ale lepiej usuń powyższe stwierdzenie. –

+0

Należy pamiętać, że SQS nie jest zgodny z HIPAA, więc to, co sugeruje nstehr, może być bardzo realnym rozwiązaniem, jeśli nie wolno przechowywać pewnych informacji w samym komunikacie SQS. –

2

Optymistyczne blokowanie DynamoDB za pomocą wersji umożliwia węzłowi "sprawdzenie" zadania przez aktualizację pola statusu na "InProgress". Jeśli inny węzeł spróbowałby sprawdzić to samo zadanie poprzez aktualizację pola statusu, otrzyma błąd i będzie wiedział, aby pobrać inne zadanie.

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

wiem, że to jest stare pytanie, więc odpowiedź jest bardziej dla społeczności niż oryginalnego plakatu.

+0

Używanie dynama w ten sposób prowadzi do problemów, jeśli twój proces umiera w połowie, a flaga w toku nigdy nie zostaje wyczyszczona. – Chaos

Powiązane problemy