DynamoDB - Gestion des erreurs

En cas d'échec du traitement d'une demande, DynamoDB renvoie une erreur. Chaque erreur se compose des éléments suivants: code d'état HTTP, nom d'exception et message. La gestion des erreurs repose sur votre SDK, qui propage les erreurs, ou sur votre propre code.

Codes et messages

Les exceptions appartiennent à différents codes d'état d'en-tête HTTP. Les 4xx et 5xx contiennent des erreurs liées aux problèmes de demande et à AWS.

Voici une sélection d'exceptions dans la catégorie HTTP 4xx -

  • AccessDeniedException - Le client n'a pas réussi à signer correctement la demande.

  • ConditionalCheckFailedException - Une condition évaluée à fausse.

  • IncompleteSignatureException - La demande comprenait une signature incomplète.

Les exceptions dans la catégorie HTTP 5xx sont les suivantes -

  • Erreur Interne du Serveur
  • Service indisponible

Nouvelles tentatives et algorithmes d'interruption

Les erreurs proviennent de diverses sources telles que des serveurs, des commutateurs, des équilibreurs de charge et d'autres éléments de structures et de systèmes. Les solutions courantes consistent en de simples tentatives, ce qui prend en charge la fiabilité. Tous les SDK incluent automatiquement cette logique et vous pouvez définir des paramètres de nouvelle tentative en fonction des besoins de votre application.

For example - Java propose une valeur maxErrorRetry pour arrêter les tentatives.

Amazon recommande d'utiliser une solution d'interruption en plus des tentatives afin de contrôler le flux. Cela consiste à augmenter progressivement les périodes d'attente entre les tentatives et à s'arrêter finalement après une période assez courte. Remarque Les SDK effectuent des tentatives automatiques, mais pas une interruption exponentielle.

Le programme suivant est un exemple d'interruption de nouvelle tentative -

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