📅  最后修改于: 2020-11-28 14:09:30             🧑  作者: Mango
在处理请求失败时,DynamoDB会引发错误。每个错误都包含以下组件:HTTP状态代码,异常名称和消息。错误管理取决于您的SDK,该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;
}