共用方式為


復原應用程式開發簡介

復原能力是應用程式從暫時性失敗中復原並繼續運作的能力。 在 .NET 程式設計的內容中,藉由設計可正常處理失敗並快速復原的應用程式來達成復原能力。 為了協助在 .NET 中建置彈性應用程式,NuGet 上提供下列兩個套件:

NuGet 套件 說明
📦 Microsoft.Extensions.Resilience 此 NuGet 套件提供機制來強化應用程式,以防止暫時性失敗。
📦 Microsoft.Extensions.Http.Resilience 此 NuGet 套件特別為 HttpClient 類別提供復原機制。

這兩個 NuGet 套件建置在 Polly 之上,這是熱門的開放原始碼專案。 Polly 是 .NET 復原和暫時性錯誤處理連結庫,可讓開發人員以流暢且安全線程的方式表達 重試斷路器、逾時、 大量隔離速率限制、後援和對沖等策略。

這很重要

Microsoft.Extensions.Http.Polly NuGet 套件已被取代。 請改用上述其中一個套件。

開始吧

若要開始使用 .NET 中的復原功能,請安裝 Microsoft.Extensions.Resilience NuGet 套件。

dotnet add package Microsoft.Extensions.Resilience

如需詳細資訊,請參閱 .NET 應用程式中 的 dotnet 套件新增管理套件相依性

建置復原管線

若要使用復原功能,您必須先建置以復原為基礎的策略管線。 每個設定的策略都會依組態順序執行。 換句話說,順序很重要。 進入點是 IServiceCollection 類型上的擴充方法,名為 AddResiliencePipeline。 這個方法會取得管線的標識碼,以及設定管線的委派。 委派會傳遞的ResiliencePipelineBuilder實例,用來將復原策略加入管線中。

請考慮下列以字串為基礎的 key 範例:

using Microsoft.Extensions.DependencyInjection;
using Polly;
using Polly.CircuitBreaker;
using Polly.Registry;
using Polly.Retry;
using Polly.Timeout;

var services = new ServiceCollection();

const string key = "Retry-Timeout";

services.AddResiliencePipeline(key, static builder =>
{
    // See: https://www.pollydocs.org/strategies/retry.html
    builder.AddRetry(new RetryStrategyOptions
    {
        ShouldHandle = new PredicateBuilder().Handle<TimeoutRejectedException>()
    });

    // See: https://www.pollydocs.org/strategies/timeout.html
    builder.AddTimeout(TimeSpan.FromSeconds(1.5));
});

上述 程式碼:

  • 建立新的 ServiceCollection 實例。
  • 定義一個key以識別管線。
  • 將復原管線新增至 ServiceCollection 實例。
  • 使用重試和逾時策略設定管線。

每個管線都會針對指定的 key 進行設定,並且每個 key 都用來在從提供者取得管線時識別對應的 ResiliencePipelinekey是方法的AddResiliencePipeline泛型型別參數。

韌性管線建構器擴充套件

若要將策略新增至管線,請在Add*實例上呼叫任何可用的ResiliencePipelineBuilder擴充方法。

  • AddRetry:如果某個項目失敗,請再試一次,當問題暫時且可能消失時會很有用。
  • AddCircuitBreaker:如果某事損壞或繁忙,請停止嘗試,這樣可以幫助您避免浪費時間並且防止事情變得更糟。
  • AddTimeout:如果某件事情花費太長的時間,請放棄,藉此釋放資源來改善效能。
  • AddRateLimiter:限制您接受的要求數目,這可讓您控制輸入負載。
  • AddConcurrencyLimiter:限制您提出多少要求,這可讓您控制輸出負載。
  • AddFallback:遇到失敗時,請執行其他動作,以改善用戶體驗。
  • AddHedging:在高延遲或失敗的情況下發出多個要求,這可以改善回應性。

如需詳細資訊,請參閱 復原策略。 如需範例,請參閱 建置彈性 HTTP 應用程式:主要開發模式

度量指標強化

增強 是自動以名稱/值對的形式附加已知狀態至遙測的過程。 例如,應用程式可能會發出記錄,其中包含 作業結果程式代碼 作為數據行,以代表某些作業的結果。 在這種情況下,根據周圍的上下文,擴充會將 叢集名稱進程名稱區域租戶 ID等新增至記錄檔,再將其傳送至遙測後端。 新增擴充時,應用程式程式代碼不需要執行任何額外的動作,即可從擴充的計量中獲益。

豐富化的運作方式

假設有 1,000 個全域分散式服務實例產生記錄和計量。 當您在 服務儀錶板上遇到問題時,快速識別有問題的區域或數據中心非常重要。 擴充可確保計量記錄包含找出分散式系統中失敗的必要資訊。 如果沒有增強,應用程式程式代碼就得承擔負擔,以內部管理此狀態、將其整合至記錄程式,然後必須手動傳輸它。 擴充可簡化此程式,順暢地處理它,而不會影響應用程式的邏輯。

在彈性的情況下,當您新增豐富化時,以下維度會被加入到輸出的遙測中:

  • error.type:例外狀況資訊的低基數版本。
  • request.name:要求的名稱。
  • request.dependency.name:相依性的名稱。

實際上,復原擴充是以 Polly 的遙測 MeteringEnricher為基礎所建置。 如需詳細資訊,請參閱 Polly:計量增強功能

新增韌性強化

除了註冊復原管線之外,您也可以註冊復原擴充。 若要新增豐富化,請在AddResilienceEnricher(IServiceCollection)實例上呼叫IServiceCollection擴充方法。

services.AddResilienceEnricher();

藉由呼叫 AddResilienceEnricher 擴充方法,您會在基礎 Polly 連結庫內建的預設維度之上新增維度。 已新增下列擴充維度:

使用韌性管線

若要使用已設定的復原管線,您必須從 ResiliencePipelineProvider<TKey>中取得復原管線。 當您稍早新增管線時, key 類型為 string,因此您必須從 ResiliencePipelineProvider<string>取得管線。

using ServiceProvider provider = services.BuildServiceProvider();

ResiliencePipelineProvider<string> pipelineProvider =
    provider.GetRequiredService<ResiliencePipelineProvider<string>>();

ResiliencePipeline pipeline = pipelineProvider.GetPipeline(key);

上述 程式碼:

  • ServiceProvider 實體建置 ServiceCollection
  • 從服務提供者取得ResiliencePipelineProvider<string>
  • ResiliencePipeline 擷取 ResiliencePipelineProvider<string>

執行韌性管線

要使用韌性管道,可以在Execute*實例上呼叫任何可用的ResiliencePipeline方法。 例如,請考慮一個對 ExecuteAsync 方法的呼叫範例:

await pipeline.ExecuteAsync(static cancellationToken =>
{
    // Code that could potentially fail.

    return ValueTask.CompletedTask;
});

上述程式碼會在 ExecuteAsync 方法內執行委派。 發生失敗時,會執行已設定的策略。 例如,如果 RetryStrategy 設定為重試三次,則會在傳遞失敗之前執行委派程式四次(一次初始嘗試加上三次重試嘗試)。

後續步驟