Реализация устойчивости приложений
Функции устойчивости .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 предоставляет эту конфигурацию вне коробки, объединяющую ряд стратегий.
Обработчик запросов проходит по каждой из вышеуказанных стратегий в порядке слева направо.
- Стратегия времени ожидания запроса: задает общее время, которое может занять запрос. Можно рассматривать это как установление верхнего временного предела для всех других стратегий.
- стратегия повторных попыток: эта стратегия управляет параметрами по количеству повторных попыток, обратных попыток и jitter. Эти параметры не могут превышать общее время ожидания, заданное в предыдущей стратегии.
- стратегия разбиения цепи: эта стратегия открывает канал, если коэффициент сбоя превышает пороговое значение.
- стратегия ожидания попытки: эта стратегия задает время ожидания для каждого отдельного запроса. Если запрос занимает больше времени, то создается исключение.
Вы можете добавить эту стандартную стратегию со всеми значениями по умолчанию, добавив этот метод расширения:
.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 секунд, то описанные выше параметры повторных попыток вызывают исключение. Это ошибка, так как настройка экспоненциальной задержки приведет к тому, что общее время на завершение 10 повторных попыток составит 2046 секунд. Это исключение среды выполнения, а не ошибка времени компиляции.
В следующей таблице перечислены параметры, доступные для каждой из стратегий.
Общие параметры времени ожидания запроса | Описание |
---|---|
ОбщийТайм-аут | Общее время, которое может занять запрос. Значение по умолчанию — 30 секунд. |
OnTimeout | Функция обратного вызова, вызываемая при истечении времени ожидания запроса. Значение по умолчанию равно NULL. |
Параметры повтора | Описание |
---|---|
КоличествоПовторов | Максимальное количество повторных попыток. Значение по умолчанию — 3. |
BackoffType | Тип задержки, который следует использовать. Вы можете выбрать между линейными и экспоненциальными. Значение по умолчанию является экспоненциальным. |
UseJitter | Следует ли добавлять колебания в механизм задержки? Jitter вносит элемент случайности в задержку, чтобы сгладить пики нагрузки. Значение по умолчанию — true. |
BaseDelay | Задержка между повторными попытками. Значение по умолчанию — 2 секунды. |
Опции автоматического выключателя | Описание |
---|---|
Длительность перерыва | Длительность разрыва цепи. Значение по умолчанию — 5 секунд. |
Коэффициент отказов | Отношение неудачных запросов к успешным запросам, которые будут открывать канал. Значение по умолчанию — 0.1. |
Длительность выборки | Длительность периода, за который рассчитывается коэффициент сбоя. Значение по умолчанию — 30 секунд. |
OnClosed | Функция обратного вызова, вызываемая при закрытии канала. Значение по умолчанию равно NULL. |
ОнХалфОпенед | Функция обратного вызова, вызываемая, когда цепь находится в полуоткрытом состоянии. Значение по умолчанию равно NULL. |
OnOpened | Функция обратного вызова, вызываемая при открытии канала. Значение по умолчанию равно NULL. |
Параметры времени ожидания попытки | Описание |
---|---|
Тайм-аут | Время, которое может занять запрос. Значение по умолчанию — 2 секунды. |
OnTimeout | Функция обратного вызова, вызываемая при истечении времени ожидания запроса. Значение по умолчанию равно NULL. |
На приведенной выше схеме последовательности показано, как каждая из стратегий работает вместе в стандартной стратегии устойчивости. Чтобы начать с ограничивающего фактора того, сколько времени может занять запрос, используется стратегия общего времени ожидания. Затем необходимо задать стратегию повторных попыток с максимальным числом попыток, которые можно выполнить в пределах общего времени ожидания. Стратегия разбиения цепи откроет канал, если коэффициент сбоя превышает пороговое значение, заданное для него. Стратегия тайм-аута попытки задает время ожидания для каждого отдельного запроса. Если запрос занимает больше времени, то создается исключение.