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; 
}