.NET6之MiniAPI(二十四):用Polly重试
生活随笔
收集整理的這篇文章主要介紹了
.NET6之MiniAPI(二十四):用Polly重试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了保障系統的穩定和安全,在調用三方服務時,可以增加重試和熔斷。重試是調用一次失敗后再試幾試,避免下游服務一次閃斷,就把整個鏈路終止;熔斷是為了防止太多的次數的無效訪問,導致系統不可知異常。
Polly是獨立的重試機制的三方庫,這里只說明在使用httpclient時,請求下游api時的重試和熔斷。需要引入NuGet包Microsoft.Extensions.Http.Polly。
先看一個簡單的重試
using Polly;var builder = WebApplication.CreateBuilder(args);builder.Services.AddHttpClient("RetryClient", httpclient =>{httpclient.BaseAddress = new Uri("http://localhost:5258");}).AddTransientHttpErrorPolicy(policyBuilder => policyBuilder.RetryAsync(3));var app = builder.Build(); //調用httpclient app.MapGet("/test", async (IHttpClientFactory httpClientFactory) => {try{var httpClient = httpClientFactory.CreateClient("RetryClient");var content = await httpClient.GetStringAsync("other-api");Console.WriteLine(content);return "ok";}catch (Exception exc){if (!Count.Time.HasValue){Count.Time = DateTime.Now;}return $"{exc.Message} 【次數:{Count.I++}】 【{Count.Time.Value.ToString("yyyy-MM-dd HH:mm:ss.fffffff")}】";} });//被調用的接口,返回狀態碼500 app.MapGet("/other-api", (ILogger<Program> logger) => {logger.LogInformation($"失敗:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff")}");return?Results.StatusCode(500); }); app.Run();static class Count {public static int I = 1;public static DateTime? Time; }返回的結果:
通過AddTransientHttpErrorPolicy(policyBuilder => policyBuilder.RetryAsync(3));我們讓請求進行了3次重試,加上原本的一次,就是4次請求。在紅色框時,會發現請求集中在極短的時間內,如果下游服務有故障,可能不會在這么短的時間內自動恢復,更好的做法是:根據重試的次數,來延長(或隨機,或自建延時算法)請求的時間,比如:
.AddTransientHttpErrorPolicy(policyBuilder =>policyBuilder.WaitAndRetryAsync(3, retryNumber =>{switch (retryNumber){case 1:return TimeSpan.FromMilliseconds(500);case 2:return TimeSpan.FromMilliseconds(1000);case 3:return TimeSpan.FromMilliseconds(1500);default:return TimeSpan.FromMilliseconds(100);}}));這時的結果如下,基本按照我們設置的時間來重試的:
還有幾種重試策略,如下:
熔斷是保護服務的手段,在本例中具體用法如下:
CircuitBreaker控制如果有6次失敗的請求,就暫停30秒,具體提示如下:
總結
以上是生活随笔為你收集整理的.NET6之MiniAPI(二十四):用Polly重试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的技术回顾因ABP框架触发DevOps
- 下一篇: 如何理解 C# 中的 System.Vo