HttpClientFactory 結(jié)合 Polly 輕松實現(xiàn)重試機制

HttpClientFactory 結(jié)合 Polly 輕松實現(xiàn)重試機制
Intro
我們的服務(wù)里有一個 API 會去調(diào)用第三方的接口,設(shè)置了超時時間,最近偶爾會發(fā)生超時的情況,微軟在提供?HttpClientFactory?的同時,也提供了一個基于?Polly?的一個擴(kuò)展,我們可以借助它輕松地實現(xiàn)重試,熔斷等行為。
Sample
使用 Polly 擴(kuò)展需要引用 nuget 包 :Microsoft.Extensions.Http.Polly
使用示例:
services.AddHttpClient(ServiceConst.IterableHttpClientName,?x?=>
{
????x.Timeout?=?new?TimeSpan(0,?0,?3);
})
????.AddTransientHttpErrorPolicy(builder?=>
????{
????????return?builder.Or()
????????????.Or()
????????????.Or()
????????????.OrResult(res?=>?res.StatusCode?==?HttpStatusCode.TooManyRequests?||?(int)res.StatusCode?>=?500)
????????????.RetryAsync(5)
????????????;
????})
通過?AddTransientHttpErrorPolicy?擴(kuò)展方法來注冊一個 Polly 的 policy,具體可以通過?policyBuilder?委托來定制自己要處理的情況和 policy 行為,支持方式有很多可以簡單的指定重試,也可以指定?WaitANdRetryAsync?等待一段時間后重試,可以重試一次也可以一直重試下去,非常的靈活,可以根據(jù)自己的業(yè)務(wù)場景進(jìn)行定制化配置,這里的示例直接是用了簡單的重試機制
單元測試
下面提供了一個測試重試的單元測試,也可以作為使用示例的一個參考:
[Fact]
public?async?Task?TaskCanceledException()
{
????var?ticks?=?new?ConcurrentBag<long>();
????var?retryLimit?=?5;
????var?services?=?new?ServiceCollection();
????services.AddHttpClient("test",?x?=>
????????{
????????????x.Timeout?=?TimeSpan.FromSeconds(1);
????????})
????????.AddTransientHttpErrorPolicy(builder?=>
????????{
????????????return?builder.Or()
????????????????????.Or()
????????????????????.Or()
????????????????????.OrResult(res?=>
????????????????????????res.StatusCode?==?HttpStatusCode.TooManyRequests?||?(int)res.StatusCode?>=?500)
????????????????????.RetryAsync(retryLimit)
????????????????;
????????})
????????.AddHttpMessageHandler(()?=>?new?MockHttpHandler(request?=>
????????{
????????????ticks.Add(DateTime.UtcNow.Ticks);
????????????throw?new?TaskCanceledException();
????????}))
????????;
????await?using?var?provider?=?services.BuildServiceProvider();
????try
????{
????????using?var?response?=?await?provider.GetRequiredService()
????????????.CreateClient("test")
????????????.GetAsync("api/test");
????}
????catch?(Exception?e)
????{
????????Assert.True(e?is?OperationCanceledException);
????}
????Assert.Equal(retryLimit?+?1,?ticks.Count);
}
private?class?MockHttpHandler?:?DelegatingHandler
{
????private?readonly?Func?_getResponseFunc;
????public?MockHttpHandler(Func?getResponseFunc )
????{
????????_getResponseFunc?=?getResponseFunc;
????}
????protected?override?Task?SendAsync(HttpRequestMessage?request,?CancellationToken?cancellationToken)
????{
????????return?Task.FromResult(_getResponseFunc(request));
????}
}
More
除了?AddTransientHttpErrorPolicy?之外,Polly 擴(kuò)展還支持?AddPolicyHandler/AddPolicyHandlerFromRegistry?擴(kuò)展方法,有興趣的可以自己探索一下哈~~
Reference
https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly https://github.com/dotnet/aspnetcore/tree/master/src/HttpClientFactory/Polly/src
【推薦】.NET Core開發(fā)實戰(zhàn)視頻課程?★★★
.NET Core實戰(zhàn)項目之CMS 第一章 入門篇-開篇及總體規(guī)劃
【.NET Core微服務(wù)實戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個接口多種實現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了
用abp vNext快速開發(fā)Quartz.NET定時任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實現(xiàn)作業(yè)調(diào)度
現(xiàn)身說法:實際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
