退避算法

来源:互联网 发布:windows 与ntp同步 编辑:程序博客网 时间:2024/06/05 18:00

退避算法应用场景

微信支付结果通知

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。

支付宝支付

程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);

Spring和退避算法

Spring-Core的util包提供了退避算法的实现,BackOff接口和BackOffExecution接口,还有两种具体的策略实现,ExponentialBackOff和FixedBackOff。

固定时间间隔重试

public static void testFixedBackOff(){        long interval = 100;        long maxAttempts = 10;        BackOff backOff = new FixedBackOff(interval, maxAttempts);        BackOffExecution execution = backOff.start();        for (int i = 1; i <= 10; i++) {            // 每次重试时间是100毫秒            System.out.println(execution.nextBackOff());        }        System.out.println(BackOffExecution.STOP);        System.out.println(execution.nextBackOff());    }

指数时间间隔重试

public static void testExponentialBackOff(){          long initialInterval = 100;//初始间隔              long maxInterval = 5 * 1000L;//最大间隔              long maxElapsedTime = 50 * 1000L;//最大时间间隔              double multiplier = 1.5;//递增倍数(即下次间隔是上次的多少倍)              ExponentialBackOff backOff = new ExponentialBackOff(initialInterval, multiplier);              backOff.setMaxInterval(maxInterval);              //currentElapsedTime = interval1 + interval2 + ... + intervalN;              backOff.setMaxElapsedTime(maxElapsedTime);              BackOffExecution execution = backOff.start();              for(int i = 1; i <= 18; i++) {                  System.out.println(execution.nextBackOff());              }            System.out.println(BackOffExecution.STOP);            System.out.println(execution.nextBackOff());      }

参考:Spring BackOff退避算法(一)

原创粉丝点击