退避算法
来源:互联网 发布: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退避算法(一)
阅读全文
1 0
- 退避算法
- 退避算法
- 退避算法
- 退避算法
- 二进制指数退避算法
- 退避算法的定义
- 重试中的指数退避算法
- 二进制指数类型退避算法
- Spring BackOff退避算法(一)
- 截断二进制指数退避算法
- CSMA/CD 及其二进制指数退避算法
- 退避算法在android开发中的应用
- 试述二进制指数退避算法规则。
- 指数退避算法exponential back-off algorithm
- CSMA/CD 及其二进制指数退避算法
- 谁有二进制指数退避的具体算法啊
- 截断二进制指数退避算法(JAVA版)
- 【Android Training - Connectivity】优化下载的效率[Lesson 2 - 调整定时更新的频率(C2DM与退避算法)]
- linux下搭建基本Java环境
- 求在多边形中画一个圆的最大半径
- C++二维数组
- HDU60 子树路径问题
- java泛型
- 退避算法
- 数组的迭代遍历
- 操作系统之进程与线程4——进程调度
- Android intent
- 逆波兰表达式算法
- jQuery知识点总结(一)重要!
- Codeforces557D Vitaly and Cycle 【染色判二分图 + 组合数学】
- Lintcode 颜色排序2
- 论 i++ 与++i 的区别