接口調用失敗的退避策略


退避策略簡介

在開發過程中我們經常會遇到調用接口失敗的情況。遇到這種情況,我們有時候需要重試機制,常用的重試(退避)策略有:

  • 固定的時間間隔重試一次,最多重試N次:比如我現在一個接口調用失敗了,不是立馬返回失敗,而是hold住線程,每隔2秒重新調下接口,最多調5次,只要其中一次成功了就直接返回。如果5次都沒成功,接口返回失敗。
  • 指數時間間隔嘗試策略:和上面策略一樣,接口調用失敗后也不是直接返回,但是重試的時間間隔呈指數增加。比如第一次時間間隔是2s,第二次次4s,依次增加。當然你也可以設置最大的嘗試次數和最大的嘗試時間。

Spring中的退避策略工具類

FixedBackOff

FixedBackOffSpring自帶的支持固定時間退避策略的工具類。這個類使用起來非常簡單:

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接口的實現。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM