2010-08-07 7 views
21

Quelle est la méthode recommandée pour mettre en œuvre un mécanisme de verrouillage simple à utiliser avec S3?Verrouillage avec S3

Exemple de ce que je veux faire:

  • verrouillage acquire par id objet
  • objet lecture de S3
  • modifier les données
  • objet d'écriture à verrouillage de sortie S3

Idéalement à la recherche d'un mécanisme de verrouillage basé sur le nuage. Je pourrais utiliser memcached localement, mais ensuite je dois gérer la mise à l'échelle. Je ne vois pas de moyen évident d'implémenter le verrouillage léger avec des API AWS, mais cela semble être un problème courant.

Je me demande si vous pouvez utiliser SimpleDB pour effectuer une opération de verrouillage d'acquisition atomique. Est-ce que quelqu'un a essayé cela?

Répondre

10

Ok, j'ai passé un peu de temps ce matin à jouer avec boto et je pense avoir une solution qui fonctionne avec SimpleDB. Vous avez besoin de la dernière version boto pour que les mises conditionnelles et les lectures cohérentes soient prises en charge.

code Exemple ici: http://pastebin.com/3XzhPqfY

S'il vous plaît poster des commentaires/suggestions. Je crois que ce code devrait être assez sûr - mon test dans main() l'essaie avec 10 threads. Une chose que je n'ai pas abordée est que les lectures S3 ne sont pas cohérentes (à droite?), Donc en théorie un thread peut fonctionner sur une ancienne copie de la valeur S3. On dirait qu'il ya peut-être une solution de contournement pour cela comme décrit ici:

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

+0

SimpleDB semble être déprécié maintenant; il est tombé de la console AWS et ne figure plus parmi leurs 'Services et Solutions'. Vous avez une implémentation qui utilise DynamoDB? :) – pjz

2

je ne pense pas que vous pouvez le faire en utilisant S3 uniquement, en utilisant les améliorations de cohérence de SimpleDB comme dit James est un bon moyen qui fonctionne

vous pouvez chercher ici quelques exemples: Amazon SimpleDB Consistency Enhancements

une autre approche qui pourrait être bien utilise le versioning feature de S3
donc en gros, stocker un id id objet/version paire dans SimpleDB comme le plus « valide » versi sur
et assurez-vous que toutes les requêtes GET récupèreront cette version
après un PUT réussi d'un objet modifié, mettez à jour l'ID de version dans la base de données

de cette façon, vous pouvez également utiliser la possibilité de récupérer les versions précédentes d'un objet à restaurer si besoin.