Dynamodb 简明教程

DynamoDB - Error Handling

在请求处理失败时,DynamoDB 会引发错误。每个错误都包含以下组件:HTTP 状态码、异常名称和消息。错误管理依赖于传播错误的SDK或您的代码。

Codes and Messages

异常会被划分为不同的HTTP首部状态码。4xx和5xx持有与请求问题和AWS相关的错误。

HTTP 4xx类别的以下异常包括:−

  1. AccessDeniedException −客户端未能正确地对请求进行签名。

  2. ConditionalCheckFailedException −条件评估为假。

  3. IncompleteSignatureException −请求包含一个不完整的签名。

HTTP 5xx 类别的异常如下所示:−

  1. Internal Server Error

  2. Service Unavailable

Retries and Backoff Algorithms

错误来自各种来源,例如服务器、交换机、负载平衡器以及其他结构和系统。通用解决方案包括支持可靠性的简单重试。所有 SDK 都自动包含此逻辑,并且您可以设置重试参数以满足您的应用程序需求。

For example −Java 提供了一个 maxErrorRetry 值来停止重试。

Amazon 建议除了重试之外,还使用退避解决方案,以控制流。这包括逐渐增加重试之间的等待时间,并最终在相当短的时间后停止重试。请注意,SDK 会自动执行重试,但不会执行指数退避。

以下程序是重试退避的一个示例:−

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