AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS

AWS 中的错误重试和指数退避

Error Retries and Exponential Backoff in AWS

Do some asynchronous operation.

retries = 0

DO
wait for (2^retries * 100) milliseconds

status = Get the result of the asynchronous operation.

IF status = SUCCESS
retry = false
ELSE IF status = NOT_READY
retry = true
ELSE IF status = THROTTLED
retry = true
ELSE
Some other error occurred, so stop calling the API.
retry = false
END IF

retries = retries + 1

WHILE (retry AND (retries < MAX_RETRIES))

===============================

public enum Results {
SUCCESS,
NOT_READY,
THROTTLED,
SERVER_ERROR
}

/*
* Performs an asynchronous operation, then polls for the result of the
* operation using an incremental delay.
*/
public static void doOperationAndWaitForResult() {

try {
// Do some asynchronous operation.
long token = asyncOperation();

int retries = 0;
boolean retry = false;

do {
long waitTime = Math.min(getWaitTimeExp(retries), MAX_WAIT_INTERVAL);

System.out.print(waitTime + " ");

// Wait for the result.
Thread.sleep(waitTime);

// Get the result of the asynchronous operation.
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 {
// Some other error occurred, so stop calling the API.
retry = false;
}

} while (retry && (retries++ < MAX_RETRIES));
}

catch (Exception ex) {
}
}

/*
* Returns the next wait interval, in milliseconds, using an exponential
* backoff algorithm.
*/
public static long getWaitTimeExp(int retryCount) {

long waitTime = ((long) Math.pow(2, retryCount) * 100L);

return waitTime;
}

原文地址:https://www.cnblogs.com/cloudrivers/p/11328875.html