Je suis en train de construire un système où S3 sera utilisé comme un hash-set persistant (l'URL S3 est déduite des données) par beaucoup d'ordinateurs sur Internet. Si deux nœuds stockent les mêmes données, ils seront stockés avec la même clé et ne seront donc pas stockés deux fois. Lorsqu'un objet est supprimé, j'ai besoin de savoir si d'autres nœuds utilisent également ces données. Dans ce cas, je ne vais pas l'enlever. En ce moment, je l'ai implémenté en ajoutant une liste des nœuds de stockage dans les données écrites en S3. Ainsi, lorsqu'un nœud stocke les données, les événements suivants se produisent:Concurrence dans Amazon S3
- Lire l'objet de S3.
- Désérialise l'objet. Ajoutez l'ID du nouveau nœud à la liste des nœuds de stockage.
- Sérialiser le nouvel objet (les données à stocker et la liste de nœuds).
- Ecrivez les données sérialisées dans S3.
Ceci crée une forme de comptage de références idempotentes. Puisque les demandes sur Internet peuvent être assez peu fiables, je ne veux pas simplement compter le nombre de nœuds de stockage. C'est pourquoi je stocke une liste à la place d'un compteur (dans le cas où un nœud envoie la même requête> 1 fois).
Cette approche fonctionne tant que deux nœuds n'écrivent pas simultanément. S3 (pour autant que je sache) ne fournit aucun moyen de verrouiller l'objet de sorte que toutes ces 5 étapes deviennent atomiques.
Comment voulez-vous résoudre ce problème de simultanéité? Je considère l'implémentation d'une certaine forme de concurrence optimiste. Comment dois-je faire pour S3? Devrais-je utiliser une approche complètement différente?
J'aime l'idée! Cela fonctionne pour les écritures, puisque S3 a maintenant une consistance read-after-write mais je suppose que nous risquons toujours de ne pas supprimer un objet, car il n'a pas de cohérence read-after-delete. – Yrlec