Реализация устойчивости приложений
Функции устойчивости .NET основаны на проекте Polly и предоставляются через Microsoft.Extensions
. Вы можете добавить стандартную стратегию устойчивости, которая использует разумные значения по умолчанию, добавив в приложение одну строку кода.
Добавление устойчивости к приложению
Чтобы добавить устойчивость к приложению, созданному с помощью архитектуры микрослужб, используя HTTP-запросы между отдельными службами, выполните следующие действия:
- Добавьте пакет в
Microsoft.Extensions.Http.Resilience
проект. - Добавьте обработчик устойчивости в вызовы службы HttpClient.
- Настройте стратегию устойчивости.
Добавление пакета NuGet в проект
Выполните следующую команду, чтобы добавить пакет NuGet для устойчивости:
dotnet add package Microsoft.Extensions.Http.Resilience
Выполнение этой команды из терминала в папке проекта приложений добавит ссылку на пакет в файл проекта.
В классе запуска приложения добавьте следующую инструкцию using:
using Microsoft.Extensions.Http.Resilience;
Добавление стратегии устойчивости
Теперь вы можете добавить стандартную стратегию устойчивости в службу HttpClient. .NET предоставляет эту конфигурацию вне коробки, объединяющую ряд стратегий.
Обработчик запросов проходит по каждой из описанных выше стратегий в форме слева направо:
- Общая стратегия времени ожидания запроса: это задает общее время, которое может занять запрос. Это можно подумать о том, как задать верхний срок для всех других стратегий.
- Стратегия повторных попыток: эта стратегия управляет параметрами по количеству повторных попыток, обратных попыток и дрожания. Эти параметры не могут превышать общее время ожидания, заданное в предыдущей стратегии.
- Стратегия разбиения цепи: эта стратегия открывает канал, если коэффициент сбоя превышает пороговое значение.
- Стратегия времени ожидания попытки. Эта стратегия задает время ожидания для каждого отдельного запроса. Если запрос занимает больше времени, то создается исключение.
Вы можете добавить эту стандартную стратегию со всеми значениями по умолчанию, добавив этот метод расширения:
.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. |
На приведенной выше схеме последовательности показано, как каждая из стратегий работает вместе в стандартной стратегии устойчивости. Чтобы начать с ограничения коэффициента того, сколько времени может занять запрос, контролируется стратегией общего времени ожидания. Затем необходимо задать стратегию повторных попыток с максимальным числом повторных попыток, которое завершится в течение всего времени ожидания. Стратегия разбиения цепи откроет канал, если коэффициент сбоя превышает пороговое значение, заданное для него. Стратегия тайм-аута попытки задает время ожидания для каждого отдельного запроса. Если запрос занимает больше времени, то создается исключение.