Что такое Polly?

«Что такое Polly?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Polly — это библиотека для .NET, реализующая шаблоны устойчивости приложений (Resilience Patterns). Она позволяет элегантно обрабатывать временные сбои, ограничивать нагрузку и управлять временем выполнения операций.

Основные политики (Policies):

  1. Retry (Повторные попытки): Повторяет операцию при возникновении указанных исключений.
  2. Circuit Breaker (Автоматический выключатель): Временно блокирует выполнение операций при высокой частоте ошибок, чтобы дать удалённой системе восстановиться.
  3. Timeout (Таймаут): Прерывает выполнение операции, если она длится дольше заданного времени.
  4. Bulkhead (Переборка): Изолирует пулы ресурсов, чтобы сбой в одной части системы не исчерпал все ресурсы (например, все потоки).
  5. Fallback (Резервный вариант): Предоставляет альтернативное значение или действие при сбое.
  6. 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.