开发手册 欢迎您!
软件开发者资料库

DynamoDB - 错误处理

DynamoDB错误处理 - 从简单和简单的步骤学习DynamoDB,从基本概念到高级概念,包括概述,基本概念,环境,操作工具,数据类型,创建,加载,查询,删除表,API接口,创建,获取,更新,删除项目,批量写入,批量检索,查询,扫描,索引,全局,本地二级索引,聚合,访问控制,权限API,条件,Web身份联合,数据管道,数据备份,监控,CloudTrail,MapReduce,表活动,错误处理,最佳实践。

如果请求处理失败,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; }