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