日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET6之MiniAPI(二十四):用Polly重试

發布時間:2023/12/4 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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);}}));

這時的結果如下,基本按照我們設置的時間來重試的:

還有幾種重試策略,如下:

//一直重試 .AddTransientHttpErrorPolicy(policyBuilder?=>?policyBuilder.RetryForeverAsync()); //每2秒重試一次 .AddTransientHttpErrorPolicy(policyBuilder?=>?policyBuilder.WaitAndRetryForeverAsync(retryNumber?=> {Console.WriteLine(retryNumber);return?TimeSpan.FromSeconds(2); })); //在5秒內4次請求,如果50%失敗,就熔斷10秒 .AddTransientHttpErrorPolicy(policyBuilder?=>policyBuilder.AdvancedCircuitBreakerAsync(0.5d,?TimeSpan.FromSeconds(5),?4,?TimeSpan.FromSeconds(10)));

熔斷是保護服務的手段,在本例中具體用法如下:

builder.Services.AddHttpClient("RetryClient", httpclient =>{httpclient.BaseAddress = new Uri("http://localhost:5258");}).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);}}))//熔斷.AddTransientHttpErrorPolicy(policyBuilder =>policyBuilder.CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)));

CircuitBreaker控制如果有6次失敗的請求,就暫停30秒,具體提示如下:

總結

以上是生活随笔為你收集整理的.NET6之MiniAPI(二十四):用Polly重试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。