DynamoDB - tratamento de erros

Em caso de falha no processamento de uma solicitação, o DynamoDB gera um erro. Cada erro consiste nos seguintes componentes: código de status HTTP, nome da exceção e mensagem. O gerenciamento de erros depende de seu SDK, que propaga erros, ou de seu próprio código.

Códigos e Mensagens

As exceções se enquadram em diferentes códigos de status de cabeçalho HTTP. O 4xx e o 5xx contêm erros relacionados a problemas de solicitação e AWS.

Uma seleção de exceções na categoria HTTP 4xx são as seguintes -

  • AccessDeniedException - O cliente falhou ao assinar o pedido corretamente.

  • ConditionalCheckFailedException - Uma condição avaliada como falsa.

  • IncompleteSignatureException - O pedido incluía uma assinatura incompleta.

As exceções na categoria HTTP 5xx são as seguintes -

  • Erro do Servidor Interno
  • Serviço indisponível

Algoritmos de tentativas e backoff

Os erros vêm de uma variedade de fontes, como servidores, switches, balanceadores de carga e outras peças de estruturas e sistemas. Soluções comuns consistem em novas tentativas simples, que oferecem suporte à confiabilidade. Todos os SDKs incluem essa lógica automaticamente e você pode definir parâmetros de repetição para atender às necessidades de seu aplicativo.

For example - Java oferece um valor maxErrorRetry para interromper novas tentativas.

A Amazon recomenda o uso de uma solução de backoff, além de novas tentativas, a fim de controlar o fluxo. Isso consiste em aumentar progressivamente os períodos de espera entre as novas tentativas e, eventualmente, parar após um período bastante curto. Observação SDKs realizam novas tentativas automáticas, mas não backoff exponencial.

O programa a seguir é um exemplo de retirada de nova tentativa -

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