DynamoDB: manejo de errores

Si el procesamiento de una solicitud no se realiza correctamente, DynamoDB genera un error. Cada error consta de los siguientes componentes: código de estado HTTP, nombre de excepción y mensaje. La gestión de errores se basa en su SDK, que propaga errores, o en su propio código.

Códigos y mensajes

Las excepciones caen en diferentes códigos de estado de encabezado HTTP. Los 4xx y 5xx contienen errores relacionados con problemas de solicitud y AWS.

Una selección de excepciones en la categoría HTTP 4xx son las siguientes:

  • AccessDeniedException - El cliente no pudo firmar la solicitud correctamente.

  • ConditionalCheckFailedException - Una condición evaluada como falsa.

  • IncompleteSignatureException - La solicitud incluía una firma incompleta.

Las excepciones en la categoría HTTP 5xx son las siguientes:

  • error de servidor interno
  • Servicio no disponible

Reintentos y algoritmos de retroceso

Los errores provienen de una variedad de fuentes, como servidores, conmutadores, equilibradores de carga y otras piezas de estructuras y sistemas. Las soluciones comunes consisten en reintentos simples, lo que respalda la confiabilidad. Todos los SDK incluyen esta lógica automáticamente y puede configurar los parámetros de reintento para satisfacer las necesidades de su aplicación.

For example - Java ofrece un valor maxErrorRetry para detener los reintentos.

Amazon recomienda utilizar una solución de retroceso además de los reintentos para controlar el flujo. Consiste en aumentar progresivamente los períodos de espera entre reintentos y, finalmente, detenerse después de un período bastante corto. Nota Los SDK realizan reintentos automáticos, pero no un retroceso exponencial.

El siguiente programa es un ejemplo de la retirada de reintento:

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