Actualmente estoy construyendo un sistema donde S3 se utilizará como un conjunto de hash persistente (la URL S3 se deduce de los datos) por muchas computadoras en Internet. Si dos nodos almacenan los mismos datos, se almacenarán con la misma clave y, por lo tanto, no se almacenarán dos veces. Cuando se elimina un objeto, necesito saber si algunos otros nodos están usando también esos datos. En ese caso, no lo eliminaré.Concurrencia en Amazon S3
Ahora lo he implementado agregando una lista de nodos de almacenamiento como parte de los datos escritos en S3. Entonces, cuando un nodo está almacenando los datos, sucede lo siguiente:
- Lea el objeto de S3.
- Deserializar el objeto.
- Agregue el ID del nuevo nodo a la lista de nodos de almacenamiento.
- Serializar el nuevo objeto (los datos para almacenar y la lista de nodos).
- Escriba los datos serializados en S3.
Esto crea una forma de conteo de referencia idempotente. Dado que las solicitudes a través de Internet pueden ser poco fiables, no quiero simplemente contar la cantidad de nodos de almacenamiento. Es por eso que estoy almacenando una lista en lugar de un contador (en caso de que un nodo envíe la misma solicitud> 1 vez).
Este enfoque funciona siempre que dos nodos no estén escribiendo simultáneamente. S3 no (hasta donde yo sé) proporciona ninguna forma de bloquear el objeto para que todos estos 5 pasos se vuelvan atómicos.
¿Cómo resolvería este problema de simultaneidad? Estoy considerando implementar alguna forma de concurrencia optimista. ¿Cómo debería hacer eso para S3? ¿Debería quizás usar un enfoque completamente diferente?
¡Me gusta la idea! Funciona para las escrituras, ya que S3 ahora tiene consistencia de lectura tras escritura, pero supongo que aún corremos el riesgo de no eliminar un objeto, ya que no tiene consistencia de lectura después de eliminación. – Yrlec