退避策略簡介
在開發過程中我們經常會遇到調用接口失敗的情況。遇到這種情況,我們有時候需要重試機制,常用的重試(退避)策略有:
- 固定的時間間隔重試一次,最多重試N次:比如我現在一個接口調用失敗了,不是立馬返回失敗,而是hold住線程,每隔2秒重新調下接口,最多調5次,只要其中一次成功了就直接返回。如果5次都沒成功,接口返回失敗。
- 指數時間間隔嘗試策略:和上面策略一樣,接口調用失敗后也不是直接返回,但是重試的時間間隔呈指數增加。比如第一次時間間隔是2s,第二次次4s,依次增加。當然你也可以設置最大的嘗試次數和最大的嘗試時間。
Spring中的退避策略工具類
FixedBackOff
FixedBackOff
是Spring
自帶的支持固定時間退避策略的工具類。這個類使用起來非常簡單:
long interval = 1000; //重試間隔 1s重試一次
long maxAttempts = 10; //最大重試次數 最多重試10次
BackOff backOff = new FixedBackOff(interval, maxAttempts);
BackOffExecution execution = backOff.start();
while(true){
long value = execution.nextBackOff();
if(value == BackOffExecution.STOP){
break;
}else{
//在這里寫你的重試邏輯
}
}
ExponentialBackOff
ExponentialBackOff
是支持嘗試間隔呈指數增加的工具類,使用方式和上面類似:
long initialInterval = 100; //初始間隔
double multiplier = 2.0; //遞增倍數
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{
//在這里寫你的重試邏輯
}
}
自定義退避策略
如果你想要實現自己的退避策略,也非常簡單。參考上面兩個類中對於BackOffExecution
接口的實現。