當前位置: 妍妍網 > 碼農

如何在 C# 中使用 Polly:輕松處理故障和重試

2024-05-30碼農


概述: 在本文中,我們將探討如何在 C# 中使用 Polly,以及它如何幫助輕松處理錯誤和重試。Polly 是一個常用的 NuGet 包,它提供了一組強大的工具和模式,可以大大簡化程式碼中的故障處理和重試機制。透過在程式碼中利用 Polly,我們可以處理各種型別的故障,例如網路錯誤或資料庫連線失敗。然後,我們可以實施智慧重試策略,以確保當其中一個不可避免地出現問題時,我們的應用程式不會崩潰(記住:墨菲定律)。Polly 提供了一種靈活且可配置的方式來處理這些情況,無論我們是需要處理暫時性故障還是只是重試失敗的操作。我將向您展示 3 個有趣的程式碼範例,這些範例展示了 Polly 在 C# 中的不同用例——所

在本文中,我們將探討如何在 C# 中使用 Polly,以及它如何幫助輕松處理錯誤和重試。Polly 是一個常用的 NuGet 包,它提供了一組強大的工具和模式,可以大大簡化程式碼中的故障處理和重試機制。

透過在程式碼中利用 Polly,我們可以處理各種型別的故障,例如網路錯誤或資料庫連線失敗。然後,我們可以實施智慧重試策略,以確保當其中一個不可避免地出現問題時,我們的應用程式不會崩潰(記住:墨菲定律)。Polly 提供了一種靈活且可配置的方式來處理這些情況,無論我們是需要處理暫時性故障還是只是重試失敗的操作。

我將向您展示 3 個有趣的程式碼範例,這些範例展示了 Polly 在 C# 中的不同用例——所以讓我們開始吧!

1 — 在 C 語言中使用 Polly 處理故障#

在構建健壯可靠的應用程式時,有效處理故障非常重要。錯誤處理是指處理常式執行過程中可能發生的錯誤、異常和失敗,我們將使用 C# 中的 Polly 來幫助我們。

為了演示 Polly 如何處理連線問題,讓我們考慮一個場景,我們的應用程式需要向外部 API 發出網路請求。我們希望確保在出現任何與連線相關的故障(例如臨時網路中斷或間歇性故障)時自動重試請求。

讓我們看看如何在 C# 中使用 Polly 來處理網路請求中的連線問題:

usingPolly;
usingPolly.Retry;
var handler = newNetworkRequestHandler();
var response = await handler.MakeNetworkRequestAsync("https://www.devleader.ca/sitemap.xml");
Console.WriteLine($"Response status code: {response.StatusCode}");
public classNetworkRequestHandler
{
privatereadonlyHttpClient _httpClient;
privatereadonlyAsyncRetryPolicy<HttpResponseMessage> _retryPolicy;
publicNetworkRequestHandler()
{
_httpClient = newHttpClient();
// Define a retry policy: retry on HttpRequestException, 3 retries with exponential backoff
_retryPolicy = Policy
.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.Or<HttpRequestException>()
.WaitAndRetryAsync(3, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
onRetry: (outcome, timespan, retryAttempt, context) =>
{
Console.WriteLine($"Request failed with {outcome.Exception?.Message}. Waiting {timespan} before next retry. Retry attempt {retryAttempt}.");
});
}
publicasyncTask<HttpResponseMessage>MakeNetworkRequestAsync(string requestUri)
{
returnawait _retryPolicy.ExecuteAsync(async () =>
{
Console.WriteLine($"Making request to {requestUri}");
var response = await _httpClient.GetAsync(requestUri);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine($"Request failed with status code: {response.StatusCode}");
thrownewHttpRequestException($"Request to {requestUri} failed with status code {response.StatusCode}");
}
return response;
});
}
}



在上面的程式碼範例中,我們定義了一個類,該類封裝了使用 .NET Framework 中的類發出網路請求的邏輯。我們用 型別的故障條件從 Polly 初始化 a。這意味著每當丟擲 an 時,都會觸發該策略。NetworkRequestHandlerHttpClientAsyncRetryPolicyHttpRequestExceptionHttpRequestException

該方法用於指定重試次數和每次重試之間的時間延遲。在此範例中,我們重試請求 3 次,使用公式 以指數方式增加延遲。WaitAndRetryTimeSpan.FromSeconds(Math.Pow(2, retryAttempt))

在該方法中,我們使用 Polly 策略透過呼叫策略上的方法來執行網路請求。如果在執行過程中發生 a,Polly 將根據定義的策略自動重試請求。MakeNetworkRequestExecuteHttpRequestException

2 — 在 C# 中使用 Polly 的重試機制

在軟體工程中,經常會遇到特定操作可能由於網路問題、資源限制或其他暫時性故障而暫時失敗的情況。在這種情況下,將實施重試機制,以自動重試失敗的操作一定次數,直到它成功或達到最大重試計數。這有助於提高軟體應用程式的可靠性和健壯性。

在 C# 中使用 Polly 簡化重試機制:

在 C# 中實作重試機制時,NuGet 包 Polly 可以派上用場。Polly 是一個功能強大的庫,它提供了一種簡單而優雅的方法來處理程式碼中的錯誤和重試。它透過將復雜的重試邏輯封裝到一組可重用的策略中來簡化實作重試的過程。

使用 Polly 自動重試失敗的資料庫操作:

讓我們考慮一個場景,我們需要執行資料庫操作,例如將記錄插入到表中,但可能存在可能導致操作失敗的臨時連線問題或資源限制。使用 Polly,我們可以透過套用重試策略輕松處理此類故障。

首先,我們需要透過將以下行添加到計畫檔的依賴項部份來安裝 Polly NuGet 包(請記住,要獲取的版本可能更新!

<ItemGroup>
<PackageReference Include="Polly"Version="8.3.0"/>
</ItemGroup>

安裝包後,我們就可以開始使用 Polly 來實作重試機制。下面是一個範例程式碼片段,演示如何使用 Polly 自動重試失敗的資料庫操作:

usingPolly;
usingSystem.Data.SqlClient;
asyncTask<bool>InsertRecordAsync(
Record record,
CancellationToken cancellationToken)
{
int maxRetryCount = 3;
var connectionString = "// TODO: configure this elsewhere...";
var retryPolicy = Policy
.Handle<SqlException>() // Specify the type of exception to handle
.WaitAndRetryAsync(maxRetryCount, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // Exponential backoff strategy
returnawait retryPolicy.ExecuteAsync(async ct =>
{
usingvar connection = newSqlConnection(connectionString);
await connection.OpenAsync();
usingvar command = connection.CreateCommand();
command.CommandText = "INSERT INTO Records (Id, Name) VALUES (@Id, @Name)";
command.Parameters.AddWithValue("@Id", record.Id);
command.Parameters.AddWithValue("@Name", record.Name);
try
{
// Perform the database operation
var result = await command.ExecuteNonQueryAsync(ct);
return result == 1;
}
catch (SqlException)
{
// Rethrow the exception to let Polly handle the retry logic
throw;
}
}, cancellationToken);
}
publicsealedrecordRecord( int Id, string Name);





在上面的範例中,我們使用該方法來定義重試策略,以指定要處理的異常型別,在本例中為 SQL 異常。然後,我們使用該方法配置策略,以使用指數退避策略重試操作,每次重試嘗試都會等待越來越多的時間。Policy.Handle<SqlException>()WaitAndRetryAsyncmaxRetryCount

在方法中,我們將資料庫操作包裝在一個 try-catch 塊中。如果操作由於 SQL 異常而失敗,我們會丟擲異常,讓 Polly 處理重試邏輯。Polly 會根據定義的策略自動重試操作,提供處理臨時故障的無縫體驗。ExecuteAsync

3 — C# 語言中 Polly 的高級重試和斷路器模式

有時,我們需要更高級的重試機制和斷路器模式,才能使我們在應用程式中達到下一個彈性水平。幸運的是,C# 中的 Polly 庫也為我們提供了這些內容!

使用外部服務或資源時,通常會遇到暫時性故障,例如網路問題或服務不可用。Polly 允許我們定義自訂重試策略,這些策略規定重試的次數以及重試之間的延遲。這確保了我們的應用程式能夠優雅地處理臨時故障並提高系統的整體可靠性。

使用 Polly 自訂重試策略

Polly 提供了靈活的選項,可根據特定要求自訂重試策略。我們可以定義重試次數、確定重試之間延遲的回退策略,甚至可以定義一個謂詞,以便僅在某些異常時有選擇地重試。透過客製這些策略,我們可以有效地處理不同的場景。

下面是一個範例,演示如何使用 Polly 透過指數退避策略實作重試策略:

var retryPolicy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(response => response.StatusCode == HttpStatusCode.InternalServerError)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

在此範例中,我們定義了一個重試策略,如果 或 的狀態程式碼為 ,則該策略將重試操作最多 3 次。回退策略是指數級的,重試之間的延遲根據重試次數呈指數級增加。HttpRequestExceptionHttpResponseMessageInternalServerError

在 C# 語言中使用 Polly 實作斷路器模式#

斷路器模式在防止級聯故障和保護系統免受對故障服務的一系列重復請求方面發揮著重要作用。Polly 為實作斷路器模式提供了內建支持,這有助於自動管理斷路器的狀態並控制請求流。

要使用 Polly 實作斷路器模式,我們需要定義失敗和成功的閾值,以及監控這些指標的時間視窗。一旦斷路器跳閘,進一步的請求就會短路,從而防止對故障服務進行不必要的呼叫。

下面是如何使用 Polly 實作斷路器模式的範例:

var circuitBreakerPolicy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(response => response.StatusCode == HttpStatusCode.InternalServerError)
.CircuitBreakerAsync(3, TimeSpan.FromSeconds(30));

在此範例中,斷路器策略配置為在 30 秒視窗內連續發生 3 次故障時跳閘開啟。斷路器開啟後,後續請求將被自動拒絕,從而阻止進一步的呼叫,直到指定的恢復期過去。

現在您知道如何在 C# 中使用 Polly!

你已經做到了!你有 3 個工作程式碼範例來幫助你了解如何在 C# 中使用 Polly。借助 Polly,您可以輕松處理故障和重試,從而提高應用程式的可靠性和彈性。在本文中,我們探討了 Polly 的三個不同用例,包括故障處理、基本重試和高級重試模式(如斷路器)。

透過將 Polly 整合到您的計畫中,您可以增強軟體的穩定性和響應能力。透過使用策略指定重試計數、持續時間和其他可配置參數,您可以控制應用程式在遇到故障時的行為和容差。