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 + "
");
// 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;
}

