Polly — библиотека, которая позволяет описывать стратегии устойчивости: ретрай, circuit breaker, таймаут, rate limiter.
Быстрый старт
dotnet add package Polly.Core
Всё строится через ResiliencePipelineBuilder — стратегии комбинируются цепочкой и применяются в порядке добавления:
ResiliencePipeline pipeline = new ResiliencePipelineBuilder()
.AddRetry(new RetryStrategyOptions())
.AddTimeout(TimeSpan.FromSeconds(10))
.Build();
await pipeline.ExecuteAsync(async token => { /* ваша логика */ }, cancellationToken);
Реактивные стратегии
Retry — повторные попытки при сбое:
new RetryStrategyOptions
{
BackoffType = DelayBackoffType.Exponential,
UseJitter = true, // случайный разброс задержки
MaxRetryAttempts = 4,
Delay = TimeSpan.FromSeconds(3),
}
Circuit Breaker — разрывает связь при превышении порога ошибок:
new CircuitBreakerStrategyOptions
{
FailureRatio = 0.5,
// 50% ошибок...
SamplingDuration = TimeSpan.FromSeconds(10),
// ...за 10 секунд
MinimumThroughput = 8,
// при минимум 8 запросах
BreakDuration = TimeSpan.FromSeconds(30),
// разрываем на 30с
}
Fallback — возвращает запасное значение при сбое:
new FallbackStrategyOptions<UserAvatar>
{
FallbackAction = static args => Outcome.FromResultAsValueTask(UserAvatar.Blank)
}
Проактивные стратегии
Timeout — гарантирует, что ожидание не превысит лимит:
new ResiliencePipelineBuilder().AddTimeout(TimeSpan.FromSeconds(3));
// бросает TimeoutRejectedException при превышении
Rate Limiter — ограничивает интенсивность запросов:
// 100 запросов в минуту (скользящее окно)
.AddRateLimiter(new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
{
PermitLimit = 100,
Window = TimeSpan.FromMinutes(1)
}));
Polly де-факто стандарт во многих командах.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view
