ECS: Verifica dell'esistenza dell'oggetto S3
Summary: Come verificare l'esistenza di oggetti all'interno di s3.
Instructions
Utilizzo di HEAD per controllare in modo più efficiente l'esistenza di un oggetto.
L'elenco degli oggetti è un modo intrinsecamente inefficiente di verificare l'esistenza di un oggetto specifico. La ricerca nell'indice non solo è relativamente lenta per questa richiesta specifica, ma può anche influire sul carico e sulle prestazioni complessivi.
La richiesta di un oggetto specifico è sempre più efficiente rispetto alla richiesta di uno o più oggetti che corrispondono ai parametri. L'elenco degli oggetti è una forma di ricerca in cui è necessario eseguire query sugli indici distribuiti.
L'uso di HEAD sull'oggetto è il metodo migliore per verificarne l'esistenza. Con l'SDK dell'oggetto ECS, questa operazione viene eseguita con GetObjectMetadataRequest.
Se l'oggetto NON esiste, l'SDK genera la seguente eccezione a causa di una risposta di errore 404:
Exception in thread "main" com.emc.object.s3.S3Exception: Not Found
Di seguito è riportato un esempio di utilizzo di GetObjectMetadataRequest utilizzato nel metodo client getObjectMetadata:
try { GetObjectMetadataRequest gom = new GetObjectMetadataRequest(<bucket>, <key>); S3ObjectMetadata om = s3.getObjectMetadata(gom); System.out.println("etag: " + om.getETag()); System.out.println("last modified: " + om.getLastModified().toString()); } catch(com.emc.object.s3.S3Exception e) { System.out.println("What happened: " + e.getMessage()); }
Se si utilizza l'SDK Java AWS e l'oggetto non esiste, l'SDK genera la seguente eccezione.
com.amazonaws.services.s3.model.AmazonS3Exception: Not Found
Ecco un esempio:
try { GetObjectMetadataRequest gom = new GetObjectMetadataRequest(AWSS3Factory.S3_BUCKET, key); s3.getObjectMetadata(gom); } catch(com.amazonaws.services.s3.model.AmazonS3Exception e) { System.out.println("What happened: " + e.getMessage()); }
Verificare se l'oggetto esiste per determinare se putObject è necessario.
Se si verifica l'esistenza dell'oggetto per determinare se putObject è necessario, prendere in considerazione l'utilizzo dei metodi condizionali PutObjectRequests:
withIfMatch() and withIfNoneMatch().
Entrambi questi metodi necessitano di un valore etag dell'oggetto e utilizzano le intestazioni "if-match," if-none-match" nella richiesta PUT.
Ci sono anche i metodi withIfUnmodifiedSince() e withIfModifiedSince() che accettano ciascuno un oggetto Date.
Se etag o md5 non sono disponibili, è necessario recuperarli con GetObjectMetadataRequest.
Un'alternativa efficiente sarebbe quella di usare withIfUnmodifiedSince() se la data è abbastanza vecchia.
SR con supporto tecnico ECS
In caso di dubbi sull'esistenza di un oggetto, aprire una Service Request con il team di supporto ECS.