HttpClientFactory 结合 Polly 轻松实现重试机制
HttpClientFactory 结合 Polly 轻松实现重试机制
Intro
我们的服务里有一个 API 会去调用第三方的接口,设置了超时时间,最近偶尔会发生超时的情况,微软在提供 HttpClientFactory
的同时,也提供了一个基于 Polly
的一个扩展,我们可以借助它轻松地实现重试,熔断等行为。
Sample
使用 Polly 扩展需要引用 nuget 包 :Microsoft.Extensions.Http.Polly
使用示例:
services.AddHttpClient(ServiceConst.IterableHttpClientName, x =>
{x.Timeout = new TimeSpan(0, 0, 3);
}).AddTransientHttpErrorPolicy(builder =>{return builder.Or<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().OrResult(res => res.StatusCode == HttpStatusCode.TooManyRequests || (int)res.StatusCode >= 500).RetryAsync(5);})
通过 AddTransientHttpErrorPolicy
扩展方法来注册一个 Polly 的 policy,具体可以通过 policyBuilder
委托来定制自己要处理的情况和 policy 行为,支持方式有很多可以简单的指定重试,也可以指定 WaitANdRetryAsync
等待一段时间后重试,可以重试一次也可以一直重试下去,非常的灵活,可以根据自己的业务场景进行定制化配置,这里的示例直接是用了简单的重试机制
单元测试
下面提供了一个测试重试的单元测试,也可以作为使用示例的一个参考:
[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<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().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<IHttpClientFactory>().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<HttpRequestMessage, HttpResponseMessage> _getResponseFunc;public MockHttpHandler(Func<HttpRequestMessage, HttpResponseMessage> getResponseFunc){_getResponseFunc = getResponseFunc;}protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){return Task.FromResult(_getResponseFunc(request));}
}
More
除了 AddTransientHttpErrorPolicy
之外,Polly 扩展还支持 AddPolicyHandler
/AddPolicyHandlerFromRegistry
扩展方法,有兴趣的可以自己探索一下哈~~
Reference
https://www.nuget.org/packages/Microsoft.Extensions.Http.Polly
https://github.com/dotnet/aspnetcore/tree/master/src/HttpClientFactory/Polly/src
HttpClientFactory 结合 Polly 轻松实现重试机制相关推荐
- .net使用httpclient获取http状态码_在 .NET Core 中结合 HttpClientFactory 使用 Polly(中篇)...
译者:码农老王 作者:Polly 团队 原文:http://t.cn/EhZ90oq 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的(包括标题).其中可能会去除一些不影响理解但本人实 ...
- Springboot 整合Retry 实现重试机制
重试,在项目需求中是非常常见的,例如遇到网络波动等,要求某个接口或者是方法可以最多/最少调用几次: 实现重试机制,非得用Retry这个重试框架吗?那肯定不是,相信很多伙伴手写一下控制流程的逻辑也可以达 ...
- loadingcache 有重试机制吗_重试机制的实现
服务在请求资源,如果遇到网络异常等情况,导致请求失败,这时需要有个重试机制来继续请求. 常见的做法是重试3次,并随机 sleep 几秒. 业务开发的脚手架,HTTP Client 基本会封装好 ret ...
- springboot 整合retry(重试机制)
当我们调用一个接口可能由于网络等原因造成第一次失败,再去尝试就成功了,这就是重试机制,spring支持重试机制,并且在Spring Cloud中可以与Hystaix结合使用,可以避免访问到已经不正常的 ...
- Spring Cloud Gateway重试机制
前言 重试,我相信大家并不陌生.在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口. 生活中这样的事例很多,比如打电话,对方正在通话中啊,信号不好啊 ...
- 一文读懂熔断器和重试机制
导语:随着微服务的流行,熔断作为其中一项很重要的技术也广为人知.当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机.本文作者介绍了熔断 ...
- invalid signature 错误原因验签失败_Nginx 失败重试机制
可直接点击上方蓝字 (网易游戏运维平台) 关注我们,获一手游戏运维方案 src 网易游戏 SRE,喜欢钻研与分享. 背景 Nginx 作为目前应用较广的反向代理服务,原生提供了一套失败重试机制,来保证 ...
- android网络重试机制,okhttp源码解析(四):重试机制
前言 这一篇我们分析okhttp的重试机制,一般如果网络请求失败,我们会考虑连续请求多次,增大网络请求成功的概率,那么okhttp是怎么实现这个功能的呢? 正文 首先还是回到之前的Intercepto ...
- Spring Retry 重试机制实现及原理
概要 Spring实现了一套重试机制,功能简单实用.Spring Retry是从Spring Batch独立出来的一个功能,已经广泛应用于Spring Batch,Spring Integration ...
最新文章
- 动态调用WebService
- [转]另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
- C++插入排序(附完整源码)
- basler相机 ip linux,Linux环境中连接Basler相机(Pylon软件的安装),ROS环境中连接Basler相机...
- python中星号变量的几种特殊用法
- Sphinx编译docs文档
- 学习笔记13-C语言-字符串函数、缓冲区
- Apache Pulsar的多租户消息系统
- 内存读写函数实现进程间通信
- mysql联合索引测试
- NLP学习—24.Pre-trained Word Embedding—ELMO、GPT、Bert
- java 查看类常量池_Java中常量以及常量池
- 工作中使用到的单词(软件开发)
- 统计学之假设检验(总体均值、总体比例、总体方差)含例题和解答
- Java中的日期与时间
- Revit SDK 介绍:ModelessForm_ExternalEvent ModelessForm_IdlingEvent
- 最简单优雅修改jupyter自带主题字体大小颜色(不需要插件不需要第三方theme)
- 2018麦考林杂志计算机科学,2020年麦考林杂志排名全解析
- 扑克牌顺子(C++)
- java开发工具(装机大全)