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