DynamoDB - Gestione degli errori
In caso di elaborazione non riuscita di una richiesta, DynamoDB genera un errore. Ogni errore è costituito dai seguenti componenti: codice di stato HTTP, nome dell'eccezione e messaggio. La gestione degli errori si basa sul tuo SDK, che propaga gli errori, o sul tuo codice.
Codici e messaggi
Le eccezioni rientrano in diversi codici di stato dell'intestazione HTTP. Gli errori di blocco 4xx e 5xx relativi a problemi di richiesta e AWS.
Una selezione di eccezioni nella categoria HTTP 4xx è la seguente:
AccessDeniedException - Il client non è riuscito a firmare correttamente la richiesta.
ConditionalCheckFailedException - Una condizione valutata come falsa.
IncompleteSignatureException - La richiesta conteneva una firma incompleta.
Le eccezioni nella categoria HTTP 5xx sono le seguenti:
- Errore interno del server
- Servizio non disponibile
Algoritmi di tentativi e backoff
Gli errori provengono da una varietà di origini come server, switch, bilanciatori del carico e altri elementi di strutture e sistemi. Le soluzioni comuni consistono in semplici tentativi, che supportano l'affidabilità. Tutti gli SDK includono automaticamente questa logica ed è possibile impostare i parametri di ripetizione in base alle esigenze dell'applicazione.
For example - Java offre un valore maxErrorRetry per interrompere i tentativi.
Amazon consiglia di utilizzare una soluzione di backoff oltre ai nuovi tentativi per controllare il flusso. Consiste nell'aumento progressivo dei periodi di attesa tra i tentativi e infine nell'arresto dopo un periodo piuttosto breve. Nota Gli SDK eseguono tentativi automatici, ma non il backoff esponenziale.
Il seguente programma è un esempio di retry backoff -
public enum Results {
SUCCESS,
NOT_READY,
THROTTLED,
SERVER_ERROR
}
public static void DoAndWaitExample() {
try {
// asynchronous operation.
long token = asyncOperation();
int retries = 0;
boolean retry = false;
do {
long waitTime = Math.min(getWaitTime(retries), MAX_WAIT_INTERVAL);
System.out.print(waitTime + "\n");
// Pause for result
Thread.sleep(waitTime);
// Get result
Results result = getAsyncOperationResult(token);
if (Results.SUCCESS == result) {
retry = false;
} else if (Results.NOT_READY == result) {
retry = true;
} else if (Results.THROTTLED == result) {
retry = true;
} else if (Results.SERVER_ERROR == result) {
retry = true;
} else {
// stop on other error
retry = false;
}
} while (retry && (retries++ < MAX_RETRIES));
}
catch (Exception ex) {
}
}
public static long getWaitTime(int retryCount) {
long waitTime = ((long) Math.pow(3, retryCount) * 100L);
return waitTime;
}