Ответ
Polly — это библиотека для .NET, реализующая шаблоны устойчивости приложений (Resilience Patterns). Она позволяет элегантно обрабатывать временные сбои, ограничивать нагрузку и управлять временем выполнения операций.
Основные политики (Policies):
- Retry (Повторные попытки): Повторяет операцию при возникновении указанных исключений.
- Circuit Breaker (Автоматический выключатель): Временно блокирует выполнение операций при высокой частоте ошибок, чтобы дать удалённой системе восстановиться.
- Timeout (Таймаут): Прерывает выполнение операции, если она длится дольше заданного времени.
- Bulkhead (Переборка): Изолирует пулы ресурсов, чтобы сбой в одной части системы не исчерпал все ресурсы (например, все потоки).
- Fallback (Резервный вариант): Предоставляет альтернативное значение или действие при сбое.
- Cache (Кэширование): Кэширует результаты вызовов (требует отдельного пакета
Polly.Caching).
Практический пример: Комбинирование Retry и Circuit Breaker для HTTP-вызова
using Polly;
using Polly.Extensions.Http;
// 1. Политика повторных попыток с экспоненциальной задержкой
var retryPolicy = HttpPolicyExtensions
.HandleTransientHttpError() // Обрабатывает 5xx, 408, 502, 503, 504
.WaitAndRetryAsync(3, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // Задержка: 2, 4, 8 сек.
// 2. Политика автоматического выключателя
var circuitBreakerPolicy = HttpPolicyExtensions
.HandleTransientHttpError()
.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); // Размыкает цепь после 5 ошибок за 30 сек.
// 3. Объединение политик в стратегию
var resiliencePipeline = Policy.WrapAsync(retryPolicy, circuitBreakerPolicy);
// 4. Использование
await resiliencePipeline.ExecuteAsync(async () =>
{
var response = await _httpClient.GetAsync("https://api.example.com/data");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
});
Преимущества использования Polly:
- Декларативный подход: Политики определяются отдельно от бизнес-логики.
- Гибкость: Политики можно комбинировать и повторно использовать.
- Асинхронная поддержка: Полная поддержка
async/await. - Интеграция с
IHttpClientFactory: Легко встраивается в конвейер обработки HTTP-запросов в ASP.NET Core.