Polly позволяет сделать ваш проект более надежным, менее хрупким и отказоустойчивым. Полли создает абстракцию, чтобы вы могли использовать шаблон повторных попыток и шаблон прерывания без каких-либо проблем или последствий. Refit, установите HTTP-клиентов и подключение к API.

Как это будет работать

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

Вид сверху

Низкий просмотр

Узоры

Шаблон повторной попытки

Шаблон повтора является чрезвычайно важным шаблоном для повышения устойчивости приложений и служб к временным сбоям. Временный сбой - распространенный тип сбоя в облачной распределенной архитектуре. Часто это связано с характером самой сети (потеря связи, тайм-аут запросов и т. Д.). Временные сбои возникают, когда службы размещаются отдельно и обмениваются данными по сети, скорее всего, по протоколу HTTP. Ожидается, что эти неисправности будут кратковременными. Повторение такого запроса, который ранее не удался, может быть успешным при следующей попытке.

Схема обрыва

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

Реализация

Для проекта API вам необходимо создать веб-приложение и контроллер. Таким образом, клиент может получить данные. Я использовал образец из шаблона веб-приложения.

В файле запуска я добавил конфигурацию CORS.

public void ConfigureServices(IServiceCollection services)
 {
    services.AddControllers();
    services.AddCors(o => o.AddPolicy(“Cors”, builder =>
    {
       builder.AllowAnyOrigin()
       .AllowAnyMethod()
       .AllowAnyHeader();
     }));
     services.AddSwaggerGen(c =>
     {
       c.SwaggerDoc(“v1”, new OpenApiInfo { Title = “API”, Version = “v1” });
     });
 }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 {
     app.UseCors(“Cors”);
….

Клиент консольного приложения

Я использую Refit для HTTP-клиента, и для этого вам нужно создать такой интерфейс

Чтобы создать политику повтора, вы можете наблюдать за методом GetWeather. Я повторяю десять раз перед исключением исключения, чтобы объяснить, как Полли знает, когда повторить попытку. Я проверяю, есть ли у InnerException какое-нибудь сообщение. Если это так, будет Console.Out.WriteLineAsync («Execução de RetryPolicy…»); и выполнит запрос еще раз, пока не достигнет счетчика повторных попыток.
Только я не очень люблю что-то одно в Полли. Вы не можете обрабатывать множественные исключения. Для обработки различных исключений вам необходимо создать одну политику для каждого исключения, а затем использовать Policy.WrapAsync (…).
У вас есть один пример Policy.WrapAsync (…) в строке 62. Я обернул политику повтора и политика прерывания цепи.

Одна вещь, которую вы должны иметь в виду, когда вы используете несколько политик в одной и той же оболочке, - это исключения, разрешенные до прерывания (в этом случае вы используете CircuitBreaker) и количество повторных попыток, которые у вас есть. Каждая повторная попытка является исключением.

Ведение журнала обернутых политик повторных попыток и прерывания цепи.

Проект находится на GitHub!