這或許是實現重試最優雅的姿勢了

來源:https://www.jianshu.com/p/d56c417d2b97

使用場景

在日常開發中,我們經常會遇到需要調用外部服務和接口的場景。外部服務對於調用者來說一般都是不可靠的,尤其是在網絡環境比較差的情況下,網絡抖動很容易導致請求超時等異常情況,這時候就需要使用失敗重試策略重新調用 API 接口來獲取。重試策略在服務治理方面也有很廣泛的使用,通過定時檢測,來查看服務是否存活(Active)。

Guava Retrying 是一個靈活方便的重試組件,包含了多種的重試策略,而且擴展起來非常容易。

用作者的話來說:

This is a small extension to Google’s Guava library to allow for the creation of configurable retrying strategies for an arbitrary function call, such as something that talks to a remote service with flaky uptime.

使用 Guava-retrying 你可以自定義來執行重試,同時也可以監控每次重試的結果和行為,最重要的基於 Guava 風格的重試方式真的很方便。

代碼示例

以下會簡單列出 guava-retrying 的使用方式:

  • 如果拋出 IOException 則重試,如果返回結果為 null 或者等於 2 則重試,固定等待時長為 300 ms,最多嘗試 3 次;


這或許是實現重試最優雅的姿勢了

出現異常則執行重試,每次任務執行最長執行時間限定為 3 s,重試間隔時間初始為 3 s,最多重試 1 分鐘,隨著重試次數的增加每次遞增 1 s,每次重試失敗,打印日誌;

這或許是實現重試最優雅的姿勢了

核心執行邏輯

這或許是實現重試最優雅的姿勢了

依賴引入

<code><dependency>
<groupid>com.github.rholder/<groupid>
<artifactid>guava-retrying/<artifactid>
<version>2.0.0/<version>
/<dependency>
/<code>

默認的guava中也有包含。

主要接口介紹

  • Attempt:一次執行任務;
  • AttemptTimeLimiter:單次任務執行時間限制(如果單次任務執行超時,則終止執行當前任務);
  • BlockStrategies:任務阻塞策略(通俗的講就是當前任務執行完,下次任務還沒開始這段時間做什麼……),默認策略為:BlockStrategies.THREAD_SLEEP_STRATEGY 也就是調用 Thread.sleep(sleepTime);
  • RetryException:重試異常;
  • RetryListener:自定義重試監聽器,可以用於異步記錄錯誤日誌;
  • StopStrategy:停止重試策略,提供三種:
    • StopAfterDelayStrategy :設定一個最長允許的執行時間;比如設定最長執行10s,無論任務執行次數,只要重試的時候超出了最長時間,則任務終止,並返回重試異常RetryException;
    • NeverStopStrategy :不停止,用於需要一直輪訓知道返回期望結果的情況;
    • StopAfterAttemptStrategy :設定最大重試次數,如果超出最大重試次數則停止重試,並返回重試異常;
  • WaitStrategy:等待時長策略(控制時間間隔),返回結果為下次執行時長:
    • FixedWaitStrategy:固定等待時長策略;
    • RandomWaitStrategy:隨機等待時長策略(可以提供一個最小和最大時長,等待時長為其區間隨機值)
    • IncrementingWaitStrategy:遞增等待時長策略(提供一個初始值和步長,等待時間隨重試次數增加而增加)
    • ExponentialWaitStrategy:指數等待時長策略;
    • FibonacciWaitStrategy :Fibonacci 等待時長策略;
    • ExceptionWaitStrategy :異常時長等待策略;
    • CompositeWaitStrategy :複合時長等待策略;


分享到:


相關文章: