共用方式為


復原應用程式開發簡介

「復原」是指應用程式從暫時性失敗中復原並繼續運作的能力。 在 .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 --version 8.0.0

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

建置復原管線

若要使用復原,您必須先建置以復原為基礎的策略管線。 每個設定的策略都會依組態順序執行。 換句話說,順序很重要。 進入點是 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 都會用來識別從提供者取得管線時的對應 ResiliencePipelinekeyAddResiliencePipeline 方法的泛型型別參數。

復原管線建立器延伸模組

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

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

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

計量擴充

擴充是名稱/值組形式,具有已知狀態的自動增強遙測。 例如,應用程式可能會發出記錄,其中包含作業結果碼作為資料行,以代表某些作業的結果。 在此情況下,視周邊內容而定,擴充會在傳送至遙測後端時,將叢集名稱程序名稱區域租用戶識別碼等項目新增至記錄。 新增擴充時,應用程式程式碼不需要執行任何額外的動作,即可從擴充的計量中獲益。

擴充的運作方式

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

在復原的情況下,當您新增擴充時,下列維度會新增至傳出遙測:

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

實際上,復原擴充是在 Polly 的遙測 MeteringEnricher 基礎上建置。 如需詳細資訊,請參閱 Polly:計量擴充

新增復原擴充

除了註冊復原管線之外,您也可以註冊復原擴充。 若要新增擴充,請在 IServiceCollection 執行個體上呼叫 AddResilienceEnricher(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);

上述 程式碼:

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

執行復原管線

若要使用復原管線,請在 ResiliencePipeline 執行個體上呼叫任何可用的 Execute* 方法。 例如,請考慮呼叫 ExecuteAsync 方法的範例:

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

    return ValueTask.CompletedTask;
});

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

下一步