Dynamodb 简明教程
DynamoDB - Error Handling
在请求处理失败时,DynamoDB 会引发错误。每个错误都包含以下组件:HTTP 状态码、异常名称和消息。错误管理依赖于传播错误的SDK或您的代码。
Codes and Messages
异常会被划分为不同的HTTP首部状态码。4xx和5xx持有与请求问题和AWS相关的错误。
HTTP 4xx类别的以下异常包括:−
-
AccessDeniedException −客户端未能正确地对请求进行签名。
-
ConditionalCheckFailedException −条件评估为假。
-
IncompleteSignatureException −请求包含一个不完整的签名。
HTTP 5xx 类别的异常如下所示:−
-
Internal Server Error
-
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;
}