Supporto alla transazione - Amazon Cloud Directory

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Supporto alla transazione

Con Amazon Cloud Directory, spesso è necessario aggiungere nuovi oggetti o aggiungere relazioni tra oggetti nuovi e oggetti esistenti per riflettere le modifiche apportate in una gerarchia reale. Le operazioni batch possono rendere attività di directory come queste più facili da gestire fornendo i seguenti benefici:

  • Le operazioni batch possono ridurre al minimo il numero di round trip necessari per scrivere e leggere gli oggetti da e nella directory, migliorando le prestazioni complessive dell'applicazione.

  • La scrittura batch fornisce la semantica delle transazioni equivalente al database SQL. Tutte le operazioni vengono completate correttamente, oppure se un'operazione ha un errore nessuna di loro viene applicata.

  • Utilizzando il riferimento batch è possibile creare un oggetto e utilizzare un riferimento al nuovo oggetto per ulteriori azioni, ad esempio aggiungendolo a un rapporto, riducendo i costi operativi dovuti all'utilizzo di un'operazione di lettura prima di un'operazione di scrittura.

BatchWrite

Utilizzare operazioni BatchWrite per eseguire diverse operazioni di scrittura su una directory. Tutte le operazioni di scrittura batch vengono eseguite in sequenza. Funziona in modo simile alle transazioni di database SQL. Se una delle operazioni all'interno della scrittura batch fallisce, l'intera scrittura batch non ha effetto sulla directory. Se una scrittura batch fallisce, si verifica un'eccezione di scrittura batch. L'eccezione contiene l'indice dell'operazione che non è riuscita insieme al messaggio e al tipo di eccezione. Queste informazioni possono aiutare a identificare la causa principale dell'errore.

Le seguenti operazioni delle API sono supportate come parte della scrittura batch:

Nome del riferimento del batch

I nomi di riferimento del batch sono supportati solo per le operazioni di scrittura batch quando è necessario fare riferimento a un oggetto come parte dell'operazione batch intermedia. Ad esempio, supponiamo che, come parte di una determinata scrittura batch, 10 diversi oggetti vengano scollegati e ricollegati a un'altra parte della directory. Senza riferimento del batch, sarebbe necessario leggere tutti i 10 riferimenti all'oggetto e fornirli come input durante il ricollegamento come parte della scrittura batch. È possibile usare un riferimento del batch per identificare le risorse scollegate durante il collegamento. Un riferimento del batch può essere qualsiasi stringa regolare preceduta dal simbolo cancelletto/hashtag (#).

Ad esempio, nel codice di esempio seguente, un oggetto con nome del link "this-is-a-typo" viene separato dalla radice con un nome di riferimento del batch "ref" . In seguito, lo stesso oggetto viene collegato alla radice con il nome del link "correct-link-name" . L'oggetto viene identificato con il set di riferimento figlio impostato su riferimento del batch. Senza il riferimento del batch, inizialmente sarebbe necessario recuperare il objectIdentifier in corso di scollegamento e fornirlo al riferimento figlio durante il collegamento. È possibile utilizzare un nome di riferimento del batch per evitare questa ulteriore lettura.

BatchDetachObject batchDetach = new BatchDetachObject() .withBatchReferenceName("ref") .withLinkName("this-is-a-typo") .withParentReference(new ObjectReference().withSelector("/")); BatchAttachObject batchAttach = new BatchAttachObject() .withParentReference(new ObjectReference().withSelector("/")) .withChildReference(new ObjectReference().withSelector("#ref")) .withLinkName("correct-link-name"); BatchWriteRequest batchWrite = new BatchWriteRequest() .withDirectoryArn(directoryArn) .withOperations(new ArrayList(Arrays.asList(batchDetach, batchAttach)));

BatchRead

Utilizzare operazioni BatchRead per eseguire diverse operazioni di lettura su una directory. Ad esempio, nel codice di esempio seguente, i figli dell'oggetto con riferimento “/managers” vengono letti insieme agli attributi dell'oggetto con riferimento “/managers/bob” in una sola lettura batch.

BatchListObjectChildren listObjectChildrenRequest = new BatchListObjectChildren() .withObjectReference(new ObjectReference().withSelector("/managers")); BatchListObjectAttributes listObjectAttributesRequest = new BatchListObjectAttributes() .withObjectReference(new ObjectReference().withSelector("/managers/bob")); BatchReadRequest batchRead = new BatchReadRequest() .withConsistencyLevel(ConsistencyLevel.SERIALIZABLE) .withDirectoryArn(directoryArn) .withOperations(new ArrayList(Arrays.asList(listObjectChildrenRequest, listObjectAttributesRequest))); BatchReadResult result = cloudDirectoryClient.batchRead(batchRead);

BatchRead supporta le seguenti operazioni delle API:

Limiti sulle operazioni batch

Ogni richiesta al server (incluse le richieste batch) ha un numero massimo di risorse sulle quali può operare, indipendentemente dal numero di operazioni nella richiesta. Questo consente di comporre le richieste batch con elevata flessibilità, a condizione di rientrare nel massimo delle risorse. Per ulteriori informazioni sul massimo delle risorse, consultare I limiti della Amazon Cloud Directory.

I limiti vengono calcolati sommando le operazioni di scrittura o di lettura per ogni singola operazione all'interno del batch​. Ad esempio, il limite di operazioni di lettura è attualmente 200 oggetti per chiamata API. Supponiamo di voler comporre un batch che aggiunga 9 chiamate API ListObjectChildren e che ogni chiamata richieda la lettura di 20 oggetti. Poiché il numero totale di oggetti da leggere (9 x 20 = 180) non supera 200, l'operazione batch verrebbe completata.

Lo stesso concetto si applica al calcolo delle operazioni di scrittura. Ad esempio, il limite di operazioni di scrittura è attualmente 20. Se si configura il batch per aggiungere 2 chiamate API UpdateObjectAttributes con 9 operazioni di scrittura ciascuna, anche questa operazione verrebbe completata. In entrambi i casi, se l'operazione batch superasse il limite, allora l'operazione fallirebbe e verrebbe generata una LimitExceededException.

Il modo corretto di calcolare il numero di oggetti inclusi all'interno di un batch è di comprendere gli oggetti sia del nodo foglia sia del nodo attuale e, se si utilizza un approccio basato su percorso per iterare la struttura di directory, è inoltre necessario includere ogni percorso sul quale viene effettuata l'iterazione, all'interno del batch. Ad esempio, come illustrato nella seguente illustrazione di un albero di directory di base, per leggere un valore attributo per l'oggetto 003, il numero di conteggio letture totale di oggetti sarebbe tre.

L'attraversamento di letture in fondo alla struttura funziona in questo modo:

1. Leggere l'oggetto 001 per determinare il percorso per l'oggetto 003

2. Scendere al Path 2

3. Leggere l'oggetto 003

Analogamente, per il numero di attributi dobbiamo contare il numero di attributi in oggetti 001 e 003 per assicurarci di non raggiungere il limite.

Gestione dell'eccezione

Le operazioni Batch in Cloud Directory possono talvolta fallire. In questi casi, è importante sapere come gestire tali errori. Il metodo utilizzato per risolvere gli errori differisce per le operazioni di scrittura e le operazioni di lettura.

Errori dell'operazione di scrittura batch

Se un'operazione di scrittura batch ha esito negativo, l'intera operazione batch da parte di Cloud Directory ha esito negativo e restituisce un'eccezione. L'eccezione contiene l'indice dell'operazione che non è riuscita insieme al messaggio e al tipo di eccezione. Se si consulta RetryableConflictException, è possibile riprovare con il backoff esponenziale. Un modo semplice per farlo è raddoppiare la quantità del tempo di attesa per ogni volta che si ottiene un'eccezione o un errore. Ad esempio, se la prima operazione di scrittura batch ha esito negativo, attendere 100 millisecondi e riprovare. Se la seconda richiesta ha esito negativo, attendere 200 millisecondi e riprovare. Se la terza richiesta ha esito negativo, attendere 400 millisecondi e riprovare.

Errori dell'operazione di lettura batch

Se un'operazione di lettura batch ha esito negativo, la risposta contiene o una risposta positiva o una risposta di eccezione. I singoli errori delle operazioni di lettura batch non causano la mancata riuscita dell'intera operazione di lettura batch. La directory cloud restituisce singole risposte negative o positive per ciascuna operazione.

Articoli relativi al blog della Cloud Directory