DynamoDB - 错误处理


如果请求处理失败,DynamoDB 会抛出错误。每个错误由以下部分组成:HTTP 状态代码、异常名称和消息。错误管理依赖于传播错误的 SDK 或您自己的代码。

代码和消息

异常分为不同的 HTTP 标头状态代码。4xx 和 5xx 包含与请求问题和 AWS 相关的错误。

HTTP 4xx 类别中的一些例外情况如下:

  • AccessDeniedException - 客户端未能正确签署请求。

  • ConditionalCheckFailedException - 评估为 false 的条件。

  • IncompleteSignatureException - 请求包含不完整的签名。

HTTP 5xx 类别中的例外情况如下:

  • 内部服务器错误
  • 暂停服务

重试和退避算法

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

例如- Java 提供了 maxErrorRetry 值来停止重试。

亚马逊建议除了重试之外还使用退避解决方案来控制流量。这包括逐渐增加重试之间的等待时间,并最终在相当短的时间后停止。注意 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; 
}