`
raymond.chen
  • 浏览: 1435809 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring BackOff退避算法

 
阅读更多

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();
		}
	}
}

 

 

分享到:
评论

相关推荐

    可与 RxJava2 一起使用 的 Backoff(截断二进制指数退避算法等)实用程序_java

    当您想要使用指数退避算法进行重试操作时,此库很有用。 指数退避是一种算法,它使用反馈乘法地降低某些过程的速率,以便逐渐找到可接受的速率。在各种计算机网络中,二进制指数退避或截断的二进制指数退避是指一种...

    Backoff Algorithms for LTE and IEEE 802.16

    Leung详细探讨了UMTS-LTE和IEEE 802.16系统中随机接入信道的两种退避算法:统一退避(Uniform Backoff,UB)和二进制指数退避(Binary Exponential Backoff,BEB)算法,并考虑了在有限用户群和非饱和流量条件下的...

    Ad+hoc网络中一种新的退避算法

    在传统的IEEE 802.11标准中,二进制指数退避(Binary Exponential Backoff, BEB)算法已被广泛使用。然而,BEB算法存在一些固有的缺陷,例如在高负载情况下容易引发严重的碰撞,导致网络性能急剧下降。因此,针对...

    一种时效性约束的二进制指数退避算法.zip

    二进制指数退避算法(Binary Exponential Backoff,BEB)是TCP/IP协议栈中解决竞争冲突的关键机制,通常应用于局域网(LAN)环境,如以太网。在无线网络环境中,考虑到时效性的约束,这种算法可能会进行一些调整以...

    backoff:Go的退缩机制

    退让 Go的惯用退缩该库是用于以惯用的Go方式重试操作的退避算法的实现。 它本来尊重context.Context ,关键通知是通过通道操作完成的,允许您编写更加明确和灵活的代码。 要进行更长的讨论,进口import "github....

    一种新Ad hoc网络退避算法 (2008年)

    MILD(Modified Binary Exponential Backoff)是对BEB的改进,尝试减少过多的退避次数,而FCR(Fair Contention Resolution)则可能更注重公平性,让所有节点都有相等的机会访问信道。 在此基础上,文章提出了一个...

    退避:Go(golang)中的简单退避算法

    退避Go(Golang)中的一个简单的指数补偿计数器安装$ go get -v github.com/jpillora/backoff用法退避是一个time.Duration计数器。 它从Min开始。 在每次调用Duration()它将乘以Factor 。 它在封顶Max 。 每次调用...

    基于相对速度的802_11p车载网络自适应退避算法_魏李琦1

    针对这一问题,魏李琦等人提出了一种基于相对速度的自适应退避算法(Relative-speed-based Self-adaptive Backoff Algorithm,简称RSBA)。传统的802.11p协议采用DCF(Distributed Coordination Function)机制进行...

    PyPI 官网下载 | backoff-1.3.1.tar.gz

    退避算法的核心思想是在遇到失败时,不是立即重新尝试,而是等待一段时间后再进行,这样可以避免短时间内大量重复请求对系统造成压力,同时也有助于解决瞬时的错误。backoff库支持多种策略,如指数退避、固定延迟等...

    论文研究-Adaptive Logarithmic Backoff Algorithm for MAC Protocol in High Density WLAN.pdf

    本文针对高密度无线局域网(WLAN)环境下的介质访问控制(MAC)协议,提出了一种自适应对数退避(Adaptive Logarithmic Backoff, ALB)算法。在高密度无线网络中,由于无线信号干扰的存在,网络面临着低吞吐量与用户...

    Design and performance evaluation of an aymptotically optima

    标题 "Design and performance evaluation of an asymptotically optimal backoff algorithm for IEEE 802.11 wireless LANs" 涉及的是无线局域网(WLAN)中的一个关键问题,即如何设计高效的退避算法以优化网络性能...

    退避:: Go中的指数退避算法

    指数退避 这是的指数补偿算法的Go端口。 是一种算法,该算法使用反馈来成倍降低某些过程的速率,以便逐渐找到可接受的速率。 当达到某个阈值时,重试次数呈指数增加,并且停止增加。 用法 导入路径是github....

    基于避免拥塞的优先级退避算法 (2013年)

    引入了拒绝帧,在网络状况极度拥塞时,采取拒绝发送方请求的方法来疏解网络压力。...结果表明:优先级二进制退避算法(Prioritized binary exponential backoff,PBEB)是提高优先级业务接入成功概率的一种有效方法。

    backoff:指数退避并重试Rust

    不同的退避算法,包括指数算法, 同时支持同步和异步代码。 同步范例 只需将您容易出错的操作包装到一个闭包中,然后将其传递给retry : use backoff :: {retry, ExponentialBackoff, Error}; let op = || { ...

    PyPI 官网下载 | backoff-1.8.0-py2.py3-none-any.whl

    1. **backoff库**:`backoff`是一个强大的错误处理库,用于实现基于退避算法的重试策略。它帮助开发者处理程序中的短暂错误,如网络超时、临时资源不可用等问题。通过自动重试,可以减少程序因为非致命错误而中断的...

    802.11DCF Dynamic Priority Backoff Algorithm

    标题中的“802.11DCF Dynamic Priority Backoff Algorithm”指的是无线局域网(WLAN)标准IEEE 802.11的分布式协调功能(DCF)中的动态优先级退避算法。这个算法是无线网络中节点如何公平地竞争共享介质的关键部分。...

    redis-backoff:指数退避 w Redis,专为密码重试而设计

    redis-backoff 使用 redis 的指数退避。 专为密码而设计。例子 var backoff = require ( 'redis-backoff' ) ( { client : require ( 'then-redis' ) . createClient ( 'tcp://localhost' )} ) ;app . use ( function...

Global site tag (gtag.js) - Google Analytics