2010-08-07 23 views
21

Was ist die empfohlene Methode zur Implementierung eines einfachen Verriegelungsmechanismus in Verbindung mit S3?Sperren mit S3

Beispiel von dem, was ich tun möchte:

  • acquire Sperre durch Objekt-ID
  • Lese-Objekt von S3
  • Datenobjekt S3
  • Schreib ändern
  • Entriegelungsschloss

Idealerweise suchen Sie nach einem Cloud-basierten Sperrmechanismus. Ich könnte memcached lokal verwenden, aber dann muss ich damit umgehen. Ich sehe keine offensichtliche Möglichkeit, Lightweight Locking mit AWS-APIs zu implementieren, aber es scheint ein häufiges Problem zu sein.

Ich frage mich, ob Sie SimpleDB verwenden könnten, um eine atomare Acquire-Lock-Operation durchzuführen. Hat das jemand probiert?

Antwort

10

Ok, ich habe heute Morgen mit Boto gespielt und ich denke, ich habe eine Lösung, die mit SimpleDB funktioniert. Sie benötigen das neueste Boto-Release, damit bedingte Puts und konsistente Lesevorgänge unterstützt werden.

Beispielcode hier: http://pastebin.com/3XzhPqfY

Bitte senden Sie Kommentare/Vorschläge. Ich glaube, dass dieser Code ziemlich sicher sein sollte - mein Test in main() versucht es mit 10 Threads.

Eine Sache, die ich nicht angesprochen habe, ist, dass S3-Lesevorgänge nicht konsistent sind (richtig?), Also könnte theoretisch ein Thread auf einer alten Kopie des S3-Wertes arbeiten. Es sieht aus wie es eine Abhilfe für das sein kann, wie hier beschrieben:

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

+0

SimpleDB scheint jetzt veraltet zu sein; Es ist von der AWS-Konsole verschwunden und wird nicht mehr unter "Dienste und Lösungen" aufgeführt. Haben Sie eine Implementierung, die DynamoDB verwendet? :) – pjz

2

Ich glaube nicht, dass Sie dies mit S3 nur tun können, Verbesserungen SimpleDB die Konsistenz mit James gesagt wird, eine gute Möglichkeit, die

funktioniert Sie für einige Beispiele hier aussehen: Amazon SimpleDB Consistency Enhancements

einen anderen Ansatz, der in Ordnung sein könnte den versioning feature von S3
so dass im Grunde verwendet, speichern ein Objekt-ID/Version id Paare in SimpleDB als die „gültig“ versi unter
und stellen Sie sicher, dass alle GET-Anfragen diese Version
nach einer erfolgreichen PUT eines modifizierten Objekts abrufen, aktualisieren Sie die Versions-ID in der DB
auf diese Weise können Sie auch die Möglichkeit, vorherige Versionen eines Objekts für die Wiederherstellung abrufen wenn benötigt.