C# Academy · Урок

Политики тайм-аутов и резервных вариантов

Ограничивайте время ожидания и обеспечивайте корректные резервные варианты.

Урок 3 из 413 шагов

«Политики тайм-аутов и резервных вариантов» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Почему важны ограничения времени ожидания

Вызов, который никогда не возвращает результат, хуже вызова, завершающегося ошибкой: он занимает потоки и соединения. Стратегия ограничения времени ожидания задаёт максимальную длительность выполнения операции, после которой Polly отменяет её.

Добавление ограничения времени ожидания

Polly v8 предоставляет AddTimeout. При превышении установленного предела выбрасывается TimeoutRejectedException и отменяется лежащий в основе токен.

using Polly.Timeout;

var pipeline = new ResiliencePipelineBuilder()
    .AddTimeout(TimeSpan.FromSeconds(3))
    .Build();

Кооперативная отмена

Ограничение времени ожидания работает, отменяя CancellationToken, переданный вашей функции обратного вызова. Ваш код должен учитывать этот токен, чтобы ограничение времени ожидания срабатывало без задержки.

await pipeline.ExecuteAsync(async token =>
{
    // token is cancelled when the timeout fires
    await httpClient.GetAsync(url, token);
});

Реакция на превышение времени ожидания

Используйте TimeoutStrategyOptions с функцией обратного вызова OnTimeout, чтобы записывать в журнал или отправлять метрики, когда выполнение операции принудительно прерывается.

new TimeoutStrategyOptions
{
    Timeout = TimeSpan.FromSeconds(3),
    OnTimeout = args =>
    {
        Console.WriteLine($"Timed out after {args.Timeout}");
        return default;
    }
};

Что такое резервный вариант

Резервный вариант предоставляет заменяющий результат, если операция завершается ошибкой, поэтому пользователь получает корректный режим с ограниченной функциональностью вместо ошибки: кэшированные данные, значение по умолчанию или понятное сообщение.

Добавление стратегии резервного варианта

AddFallback требует типизированного конвейера. Вы задаёте, какие ошибки нужно обрабатывать и какое значение возвращать вместо исходного.

using Polly.Fallback;

var pipeline = new ResiliencePipelineBuilder<string>()
    .AddFallback(new FallbackStrategyOptions<string>
    {
        ShouldHandle = new PredicateBuilder<string>()
            .Handle<HttpRequestException>(),
        FallbackAction = args =>
            Outcome.FromResultAsValueTask("cached default")
    })
    .Build();

Возврат кэшированных данных в качестве резервного варианта

Распространённый подход — возвращать последнее достоверно полученное значение из кэша, если прямой вызов завершается ошибкой, чтобы приложение сохраняло отзывчивость.

FallbackAction = args =>
{
    var cached = _cache.GetLastKnownGood();
    return Outcome.FromResultAsValueTask(cached);
}

Наблюдение за резервными вариантами

Функция обратного вызова OnFallback срабатывает при использовании резервного варианта и идеально подходит для записи в журнал информации о переходе по пути с ограниченной функциональностью.

new FallbackStrategyOptions<string>
{
    FallbackAction = args => Outcome.FromResultAsValueTask("default"),
    OnFallback = args =>
    {
        Console.WriteLine("Fallback executed");
        return default;
    }
};

Ограничение времени ожидания и резервный вариант вместе

Их объединение даёт мощный результат: ограничение времени ожидания ограничивает длительность ожидания, а резервный вариант предоставляет значение при превышении времени ожидания или возникновении любой другой обрабатываемой ошибки, поэтому вызывающая сторона никогда не зависает и не завершается аварийно.

Выбор разумных ограничений времени ожидания

Устанавливайте ограничения времени ожидания на основе реалистичной задержки и запаса, а не произвольно выбирайте слишком маленькие значения. Слишком жёсткое ограничение приводит к ошибкам даже в исправных вызовах, а слишком мягкое лишает это ограничение смысла.

Резервный вариант — крайняя мера

Размещайте резервный вариант как самую внешнюю стратегию, чтобы он мог перехватывать ошибки повторных попыток, автоматического выключателя и ограничений времени ожидания, гарантируя вызывающей стороне всегда пригодный результат.

Быстрая проверка

Проверьте стратегии ограничения времени ожидания и резервного варианта.

Итоги

Ограничения времени ожидания ограничивают длительность операции с помощью AddTimeout, отменяя токен и выбрасывая TimeoutRejectedException (не забывайте учитывать токен!). Резервные варианты возвращают заменяющие результаты через AddFallback с помощью FallbackAction, часто предоставляя кэшированные данные. Вместе они сохраняют отзывчивость приложений: ограничивают ожидание, а затем обеспечивают корректный переход в режим с ограниченной функциональностью. Размещайте резервный вариант внешним, чтобы он перехватывал все обрабатываемые ошибки.

Можно начать бесплатно

Изучай C# с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
93
Уроки
346

Часто задаваемые вопросы

Урок «Политики тайм-аутов и резервных вариантов» бесплатный?

Да — полный текст урока «Политики тайм-аутов и резервных вариантов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Политики тайм-аутов и резервных вариантов»?

Ограничивайте время ожидания и обеспечивайте корректные резервные варианты. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Политики тайм-аутов и резервных вариантов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Политики повторных попыток
  2. Шаблон автоматического размыкателя
  3. Политики тайм-аутов и резервных вариантов
  4. Конвейеры отказоустойчивости
← Назад к C# Academy