Spring的util包提供了退避算法的实现,BackOff接口和BackOffExecution接口,还有两种具体的策略实现,ExponentialBackOff和FixedBackOff。
FixedBackOff 固定时间间隔重试
每次的间隔时间一样,累计间隔次数达到设定值时,下次BackOff返回-1
long interval = 1000; //重试间隔 long maxAttempts = 10; //最大重试次数 BackOff backOff = new FixedBackOff(interval, maxAttempts); BackOffExecution execution = backOff.start(); while(true){ long value = execution.nextBackOff(); if(value == BackOffExecution.STOP){ break; }else{ System.out.println(value); } }
ExponentialBackOff 指数时间间隔重试
间隔时间每次倍数递增,达到最大的间隔时间后就不再递增。累计的间隔时间达到设定值时,下次BackOff返回-1
long initialInterval = 100; //初始间隔 double multiplier = 1.5; //递增倍数 long maxInterval = 5 * 1000L; //最大间隔 long maxElapsedTime = 50 * 1000L; //累计最大的时间间隔 ExponentialBackOff backOff = new ExponentialBackOff(initialInterval, multiplier); backOff.setMaxInterval(maxInterval); backOff.setMaxElapsedTime(maxElapsedTime); BackOffExecution execution = backOff.start(); while(true){ long value = execution.nextBackOff(); if(value == BackOffExecution.STOP){ break; }else{ System.out.println(value); } }
自定义退避算法:
LoopExponentialBackOff: 可循环的指数时间间隔重试:间隔时间每次倍数递增,达到最大的间隔时间后,从初始的间隔时间重新倍数递增,无穷循环。
public class LoopExponentialBackOff implements BackOff { public static final long DEFAULT_INITIAL_INTERVAL = 2000L; public static final double DEFAULT_MULTIPLIER = 1.5; public static final long DEFAULT_MAX_INTERVAL = 30000L; private long initialInterval = DEFAULT_INITIAL_INTERVAL; private double multiplier = DEFAULT_MULTIPLIER; private long maxInterval = DEFAULT_MAX_INTERVAL; public LoopExponentialBackOff(){ } public LoopExponentialBackOff(long initialInterval, double multiplier){ checkMultiplier(multiplier); this.initialInterval = initialInterval; this.multiplier = multiplier; } public long getInitialInterval() { return initialInterval; } public void setInitialInterval(long initialInterval) { this.initialInterval = initialInterval; } public double getMultiplier() { return multiplier; } public void setMultiplier(double multiplier) { checkMultiplier(multiplier); this.multiplier = multiplier; } public long getMaxInterval() { return maxInterval; } public void setMaxInterval(long maxInterval) { this.maxInterval = maxInterval; } private void checkMultiplier(double multiplier) { if (multiplier < 1) { throw new IllegalArgumentException("Invalid multiplier '" + multiplier + "'. Should be equal" + "or higher than 1. A multiplier of 1 is equivalent to a fixed interval"); } } @Override public BackOffExecution start() { return new LoopExponentialBackOffExecution(); } private class LoopExponentialBackOffExecution implements BackOffExecution { private long currentInterval = -1; @Override public long nextBackOff() { long nextInterval = computeNextInterval(); return nextInterval; } private long computeNextInterval() { long maxInterval = getMaxInterval(); if(this.currentInterval < 0 || this.currentInterval >= maxInterval){ long initialInterval = getInitialInterval(); this.currentInterval = (initialInterval < maxInterval ? initialInterval : maxInterval); }else { this.currentInterval = multiplyInterval(maxInterval); } return this.currentInterval; } private long multiplyInterval(long maxInterval) { long i = this.currentInterval; i *= getMultiplier(); return (i > maxInterval ? maxInterval : i); } @Override public String toString() { StringBuilder sb = new StringBuilder("LoopExponentialBackOff{"); sb.append("currentInterval=").append(this.currentInterval < 0 ? "n/a" : this.currentInterval + "ms"); sb.append(", multiplier=").append(getMultiplier()); sb.append('}'); return sb.toString(); } } }
相关推荐
当您想要使用指数退避算法进行重试操作时,此库很有用。 指数退避是一种算法,它使用反馈乘法地降低某些过程的速率,以便逐渐找到可接受的速率。在各种计算机网络中,二进制指数退避或截断的二进制指数退避是指一种...
Ad Hoc网络MAC协议退避算法仿真与比较,姜振辉,邢瑞阳,二进制指数退避算法(Binary Exponential Backoff,BEB)有利于提高网络吞吐量,但是存在不公平性问题,本文对BEB算法进行了仿真,并从公平性��
Backoff Algorithms for Random Access Channels in UMTS-LTE and IEEE 802.16 Systems
退让 Go的惯用退缩该库是用于以惯用的Go方式重试操作的退避算法的实现。 它本来尊重context.Context ,关键通知是通过通道操作完成的,允许您编写更加明确和灵活的代码。 要进行更长的讨论,进口import "github....
退避Go(Golang)中的一个简单的指数补偿计数器安装$ go get -v github.com/jpillora/backoff用法退避是一个time.Duration计数器。 它从Min开始。 在每次调用Duration()它将乘以Factor 。 它在封顶Max 。 每次调用...
引入了拒绝帧,在网络状况极度拥塞时,采取拒绝发送方请求的方法来疏解网络压力。...结果表明:优先级二进制退避算法(Prioritized binary exponential backoff,PBEB)是提高优先级业务接入成功概率的一种有效方法。
指数退避 这是的指数补偿算法的Go端口。 是一种算法,该算法使用反馈来成倍降低某些过程的速率,以便逐渐找到可接受的速率。 当达到某个阈值时,重试次数呈指数增加,并且停止增加。 用法 导入路径是github....
不同的退避算法,包括指数算法, 同时支持同步和异步代码。 同步范例 只需将您容易出错的操作包装到一个闭包中,然后将其传递给retry : use backoff :: {retry, ExponentialBackoff, Error}; let op = || { ...
backoff_supervisor backoff_supervisor是一个simple_one_for_one主管,有以下区别: 最多 1 个孩子。 start_child/2在尝试启动第二个孩子时返回{error, {already_started, Pid}} 。 最大重启次数为0 。 如果一个...
配置后,提供一个函数,该函数最终将使用指数退避算法调用所提供的函数。 用法 var backoff = require ( 'backoff-func' ) . create ( { delay : 10 , // default value maxDelay : 10000 , // default value ...
redis-backoff 使用 redis 的指数退避。 专为密码而设计。例子 var backoff = require ( 'redis-backoff' ) ( { client : require ( 'then-redis' ) . createClient ( 'tcp://localhost' )} ) ;app . use ( function...
Python 退避装饰器 这个包实现了指数退避作为装饰器。 退避由异常触发并在调用成功时重置。 用法 通过简单地添加装饰器,将指数退避应用于任何函数或方法: import backoff import requests @ backoff . Backoff ...
资源来自pypi官网。 资源全名:backoff-1.3.1.tar.gz
pester - Go HTTP 客户端调用拥有重试、backoff 和并发性
backoff, 在Erlang中,简单的指数 backoffs 退避退退是处理指数backoffs和计时器在处理循环事件( 如重新连接) 时使用的一个Erlang库。编译./rebar get-deps compile运行测试测试是作为基本的基于属性的测试套件实现...
退避重试用于使用指数退避重试异步操作的简单库。 var Backoff = require ( '../lib/backoff' ) ;function runAttempt ( callback ) { setTimeout ( function ( ) { // alwasy fail for this example callback ( new...
AIAD:IEEE 802.11 DCF中一种改进的退避机制,卢凯,,IEEE 802.11 DCF的基本退避算法BEB以它的简单高效而得到广泛认可,但随着网络负载的增加,由于竞争窗口变化过于剧烈,造成了严重的不公
backoff禁用iPhone在iTunes上自动备份,很方便的小软件
2nd International Chinese Word Segmentation Bakeoff - Data Release Release 1, 2005-11-18 * Introduction This directory contains the training, test, and gold-standard data used in the 2nd ...
资源来自pypi官网,解压后可用。 资源全名:backoff-1.8.0-py2.py3-none-any.whl