zoukankan      html  css  js  c++  java
  • AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff

    网络上的大量组件 (例如 DNS 服务器、交换机、负载均衡器等) 都可能在某个指定请求生命周期中的任一环节出现问题。在联网环境中,处理这些错误回应的常规技术是在客户应用程序中实施重试。此技术可以提高应用程序的可靠性和降低开发人员的操作成本。

    每个 AWS 开发工具包都会实现自动重试逻辑。AWS SDK for Java会自动重试请求,您可以使用 ClientConfiguration 类配置重试设置。例如,对于发出的请求采用最低延迟并且不想重试的网页,您可能会希望关闭重试逻辑。您可以使用 ClientConfiguration 类,并且为 maxErrorRetry 提供 0 这个值,从而设置为不重试。

    如果您没有使用 AWS 开发工具包,则应当对收到服务器错误 (5xx) 或限制错误的原始请求执行重试。但是,客户端错误 (4xx) 表示您需要对请求本身进行修改,纠正该问题,然后再重试。

    除了简单重试之外,每个 AWS 开发工具包还实施指数退避算法来实现更好的流程控制。指数退避的原理是对于连续错误响应,重试等待间隔越来越长。您应该实施最长延迟间隔和最大重试次数。最长延迟间隔和最大重试次数不一定是固定值,并且应当根据正在执行的操作和其他本地因素(例如网络延迟)进行设置。

    大多数指数退避算法会利用抖动(随机延迟)来防止连续的冲突。由于在这些情况下您并未尝试避免此类冲突,因此无需使用此随机数字。但是,如果使用并发客户端,抖动可帮助您更快地成功执行请求。

    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;
    }
  • 相关阅读:
    Proc、宿主变量、指示变量、数组变量、通信区sqlca,oraca ---(day07)
    Cursor、Exception、Procedure、Function、Package、Trigger(day06)
    大话设计模式C++版——建造者模式
    大话设计模式C++版——观察者模式
    大话设计模式C++版——代理模式
    大话设计模式C++版——工厂模式在COM中的典型应用
    大话设计模式C++版——抽象工厂模式
    大话设计模式C++版——工厂方法模式
    exe文件无法打开
    数据驱动编程之表驱动法
  • 原文地址:https://www.cnblogs.com/cloudrivers/p/11620469.html
Copyright © 2011-2022 走看看