使用 IHttpClientFactory 和 Polly 原則以指數輪詢來執行 HTTP 呼叫重試

使用指數輪詢重試的建議方法是利用更進階的 .NET 程式庫,例如開放原始碼 Polly 程式庫

Polly 是 .NET 程式庫,提供恢復功能和暫時性錯誤處理功能。 您可以藉由套用重試、斷路器、艙壁隔離 (Bulkhead Isolation)、逾時和後援等 Polly 原則,來實作這些功能。 Polly 目標 .NET Framework 4.x 和 .NET Standard 1.0、1.1 和 2.0 (可支援 .net Core 和更新版本的) 。

下列步驟示範如何使用 Http 重試,並將 Polly 整合至 IHttpClientFactory ,這會在上一節中說明。

參考 .NET 5 封裝

IHttpClientFactory自 .net Core 2.1 起提供,不過我們建議您從專案中的 NuGet 使用最新的 .net 5 套件。 您通常也需要參考延伸模組套件 Microsoft.Extensions.Http.Polly

在啟動時使用 Polly 的重試原則設定用戶端

如先前章節所示,您必須在標準 Startup.ConfigureServices(...) 方法中定義具名或具類型的用戶端 HttpClient 組態,但現在您可以新增累加式程式碼,為使用指數輪詢的 Http 重試指定原則,如下所示:

//ConfigureServices()  - Startup.cs
services.AddHttpClient<IBasketService, BasketService>()
        .SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Set lifetime to five minutes
        .AddPolicyHandler(GetRetryPolicy());

AddPolicyHandler() 方法會將原則新增至您將使用的 HttpClient 物件。 在此情況下,它會使用指數輪詢來新增 Polly 的 Http 重試原則。

為了有更模組化的方法,可在 Startup.cs 檔案內的個別方法中定義 Http 重試原則,如以下程式碼所示:

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
                                                                    retryAttempt)));
}

透過 Polly,您可以定義重試原則,其中包含重試次數、指數輪詢組態,以及發生 HTTP 例外狀況時所要採取的動作,例如記錄錯誤。 在本例中,會設定原則,以便使用指數重試嘗試六次,一開始每隔兩秒。

將 Jitter 策略新增至重試原則

一般重試原則可能會影響您的系統,但在高並行和擴充性的情況下,也會受到高爭用。 若要克服來自許多用戶端在部分中斷時所發生類似重試的尖峰情形,最好的解決方法是將抖動策略新增至重試演算法/原則。 此策略可以改善端對端系統的整體效能。 如同 Polly 中的建議 :以抖動重試,可透過在指數輪詢上以妥善控制的中位數初始重試延遲套用的平滑和平均分散式重試間隔,來實行良好的抖動策略。 這種方法有助於在問題發生時分散尖峰。 下列範例將說明此原則:


var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

其他資源