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(); } } }
相关推荐
当您想要使用指数退避算法进行重试操作时,此库很有用。 指数退避是一种算法,它使用反馈乘法地降低某些过程的速率,以便逐渐找到可接受的速率。在各种计算机网络中,二进制指数退避或截断的二进制指数退避是指一种...
Leung详细探讨了UMTS-LTE和IEEE 802.16系统中随机接入信道的两种退避算法:统一退避(Uniform Backoff,UB)和二进制指数退避(Binary Exponential Backoff,BEB)算法,并考虑了在有限用户群和非饱和流量条件下的...
在传统的IEEE 802.11标准中,二进制指数退避(Binary Exponential Backoff, BEB)算法已被广泛使用。然而,BEB算法存在一些固有的缺陷,例如在高负载情况下容易引发严重的碰撞,导致网络性能急剧下降。因此,针对...
二进制指数退避算法(Binary Exponential Backoff,BEB)是TCP/IP协议栈中解决竞争冲突的关键机制,通常应用于局域网(LAN)环境,如以太网。在无线网络环境中,考虑到时效性的约束,这种算法可能会进行一些调整以...
退让 Go的惯用退缩该库是用于以惯用的Go方式重试操作的退避算法的实现。 它本来尊重context.Context ,关键通知是通过通道操作完成的,允许您编写更加明确和灵活的代码。 要进行更长的讨论,进口import "github....
MILD(Modified Binary Exponential Backoff)是对BEB的改进,尝试减少过多的退避次数,而FCR(Fair Contention Resolution)则可能更注重公平性,让所有节点都有相等的机会访问信道。 在此基础上,文章提出了一个...
退避Go(Golang)中的一个简单的指数补偿计数器安装$ go get -v github.com/jpillora/backoff用法退避是一个time.Duration计数器。 它从Min开始。 在每次调用Duration()它将乘以Factor 。 它在封顶Max 。 每次调用...
针对这一问题,魏李琦等人提出了一种基于相对速度的自适应退避算法(Relative-speed-based Self-adaptive Backoff Algorithm,简称RSBA)。传统的802.11p协议采用DCF(Distributed Coordination Function)机制进行...
退避算法的核心思想是在遇到失败时,不是立即重新尝试,而是等待一段时间后再进行,这样可以避免短时间内大量重复请求对系统造成压力,同时也有助于解决瞬时的错误。backoff库支持多种策略,如指数退避、固定延迟等...
本文针对高密度无线局域网(WLAN)环境下的介质访问控制(MAC)协议,提出了一种自适应对数退避(Adaptive Logarithmic Backoff, ALB)算法。在高密度无线网络中,由于无线信号干扰的存在,网络面临着低吞吐量与用户...
标题 "Design and performance evaluation of an asymptotically optimal backoff algorithm for IEEE 802.11 wireless LANs" 涉及的是无线局域网(WLAN)中的一个关键问题,即如何设计高效的退避算法以优化网络性能...
指数退避 这是的指数补偿算法的Go端口。 是一种算法,该算法使用反馈来成倍降低某些过程的速率,以便逐渐找到可接受的速率。 当达到某个阈值时,重试次数呈指数增加,并且停止增加。 用法 导入路径是github....
引入了拒绝帧,在网络状况极度拥塞时,采取拒绝发送方请求的方法来疏解网络压力。...结果表明:优先级二进制退避算法(Prioritized binary exponential backoff,PBEB)是提高优先级业务接入成功概率的一种有效方法。
不同的退避算法,包括指数算法, 同时支持同步和异步代码。 同步范例 只需将您容易出错的操作包装到一个闭包中,然后将其传递给retry : use backoff :: {retry, ExponentialBackoff, Error}; let op = || { ...
1. **backoff库**:`backoff`是一个强大的错误处理库,用于实现基于退避算法的重试策略。它帮助开发者处理程序中的短暂错误,如网络超时、临时资源不可用等问题。通过自动重试,可以减少程序因为非致命错误而中断的...
标题中的“802.11DCF Dynamic Priority Backoff Algorithm”指的是无线局域网(WLAN)标准IEEE 802.11的分布式协调功能(DCF)中的动态优先级退避算法。这个算法是无线网络中节点如何公平地竞争共享介质的关键部分。...
redis-backoff 使用 redis 的指数退避。 专为密码而设计。例子 var backoff = require ( 'redis-backoff' ) ( { client : require ( 'then-redis' ) . createClient ( 'tcp://localhost' )} ) ;app . use ( function...