Реализация устойчивости приложений

Завершено

Функции устойчивости .NET основаны на проекте Polly и предоставляются через Microsoft.Extensions. Вы можете добавить стандартную стратегию устойчивости, которая использует разумные значения по умолчанию, добавив в приложение одну строку кода.

Добавление устойчивости к приложению

Чтобы добавить устойчивость к приложению, созданному с помощью архитектуры микрослужб, используя HTTP-запросы между отдельными службами, выполните следующие действия:

  1. Добавьте пакет в Microsoft.Extensions.Http.Resilience проект.
  2. Добавьте обработчик устойчивости в вызовы службы HttpClient.
  3. Настройте стратегию устойчивости.

Добавление пакета NuGet в проект

Выполните следующую команду, чтобы добавить пакет NuGet для устойчивости:

dotnet add package Microsoft.Extensions.Http.Resilience

Выполнение этой команды из терминала в папке проекта приложений добавит ссылку на пакет в файл проекта.

В классе запуска приложения добавьте следующую инструкцию using:

using Microsoft.Extensions.Http.Resilience;

Добавление стратегии устойчивости

Теперь вы можете добавить стандартную стратегию устойчивости в службу HttpClient. .NET предоставляет эту конфигурацию вне коробки, объединяющую ряд стратегий.

A diagram showing the strategies included in the Standard Resilience Handler. From overall timeout, retry, bulkhead, circuit breaker, and attempt timeout.

Обработчик запросов проходит по каждой из описанных выше стратегий в форме слева направо:

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

Вы можете добавить эту стандартную стратегию со всеми значениями по умолчанию, добавив этот метод расширения:

.AddStandardResilienceHandler();

Например, если вы объявили и WebApplicationхотите добавить стратегию устойчивости в службу HttpClient, используйте следующий код:

builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();

Первая строка приведенного выше кода добавляет стандартный обработчик устойчивости в HTTPClient. При этом будут использоваться все параметры по умолчанию для стратегий повторных попыток и останова цепи.

Настройка стратегии устойчивости

Вы можете изменить значения по умолчанию любого из стратегий, указав новые параметры, например:

.AddStandardResilienceHandler( options => 
{  
    options.RetryOptions.RetryCount = 10;
    options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});

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

Параметры, которые вы выбрали, должны быть совместимы друг с другом. Например, если общее время остается по умолчанию в 30 секунд, то описанные выше параметры повторных попыток вызывают исключение. Это ошибка, так как экспоненциальный параметр обратного выхода приведет к тому, что общее время завершения повторных попыток составляет 2046 секунд. Это исключение среды выполнения, а не ошибка времени компиляции.

В следующей таблице перечислены параметры, доступные для каждой из стратегий.

Общие параметры времени ожидания запроса Description
TotalTimeout Общее время, которое может занять запрос. Значение по умолчанию — 30 секунд.
OnTimeout Функция обратного вызова, вызываемая при истечении времени ожидания запроса. Значение по умолчанию равно NULL.

Параметры повтора Description
RetryCount Максимальное число попыток. Значение по умолчанию — 3.
BackoffType Тип обратного выхода для использования. Вы можете выбрать между линейными и экспоненциальными. Значение по умолчанию является экспоненциальным.
UseJitter Следует ли добавлять дрожи в задней части. Jitter добавляет случайность в задержку, чтобы помочь уменьшить пики нагрузки. Значение по умолчанию: true.
BaseDelay Задержка между повторными попытками. Значение по умолчанию — 2 секунды.

Параметры разбиения цепи Description
BreakDuration Длительность разрыва цепи. Значение по умолчанию — 5 секунд.
FailureRatio Отношение неудачных запросов к успешным запросам, которые будут открывать канал. Значение по умолчанию равно 0,1.
ВыборкаDuration Длительность времени вычисления коэффициента сбоя. Значение по умолчанию — 30 секунд.
OnClosed Функция обратного вызова, вызываемая при закрытии канала. Значение по умолчанию — NULL.
OnHalfOpened Функция обратного вызова, вызываемая при полуоткрытии канала. Значение по умолчанию — NULL.
OnOpened Функция обратного вызова, вызываемая при открытии канала. Значение по умолчанию — NULL.

Параметры времени ожидания попытки Description
Время ожидания Время, которое может занять запрос. Значение по умолчанию — 2 секунды.
OnTimeout Функция обратного вызова, вызываемая при истечении времени ожидания запроса. Значение по умолчанию равно NULL.

A sequence diagram showing the flow of events in an application using a resiliency strategy.

На приведенной выше схеме последовательности показано, как каждая из стратегий работает вместе в стандартной стратегии устойчивости. Чтобы начать с ограничения коэффициента того, сколько времени может занять запрос, контролируется стратегией общего времени ожидания. Затем необходимо задать стратегию повторных попыток с максимальным числом повторных попыток, которое завершится в течение всего времени ожидания. Стратегия разбиения цепи откроет канал, если коэффициент сбоя превышает пороговое значение, заданное для него. Стратегия тайм-аута попытки задает время ожидания для каждого отдельного запроса. Если запрос занимает больше времени, то создается исключение.