復原能力是應用程式從暫時性失敗中復原並繼續運作的能力。 在 .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 套件。
如需詳細資訊,請參閱 .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 都用來在從提供者取得管線時識別對應的 ResiliencePipeline。
key是方法的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 連結庫內建的預設維度之上新增維度。 已新增下列擴充維度:
- 根據IExceptionSummarizer的例外狀況擴充,提供了一種機制來彙總用於電腦遙測的例外狀況。 如需詳細資訊,請參閱 例外狀況摘要。
- 根據RequestMetadata中保存的要求元數據進行元數據擴充,以用於遙測。 如需詳細資訊,請參閱 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 設定為重試三次,則會在傳遞失敗之前執行委派程式四次(一次初始嘗試加上三次重試嘗試)。