重新整理 .net core 实践篇————polly失败重试[三十四]
前言
简单整理一下polly 重试。
正文
在开发程序中一般都有一个重试帮助类,那么polly同样有这个功能。
polly 组件包:
polly 功能包
polly.Extensions.Http 专门针对http的扩展包
Miscrosoft.Extension.Http.Polly 看到这个名字,那么99%是针对官方.net core的扩展包,是HttpClientFactory 的扩展。
polly有下面一些功能:
失败重试
服务熔断
超时处理
舱壁处理
缓存策略
失败降级
组合策略
其他都好理解,但是舱壁处理 是什么呢?
这个是限流功能,服务定义最大的流量和队列,避免请求量过大而崩溃。
组合策略,就是对上面的功能可以自由组合。
polly 使用步骤:
定于要处理的异常类型和返回值
定义要处理的工作
使用定义的策略来执行代码
polly的源代码:
https://github.com/App-vNext/Polly
polly 针对http的扩展包:
https://github.com/App-vNext/Polly.Extensions.Http
适合polly 重试的场景:
1.服务"失败"是短暂的,可自愈的。
针对这种http请求,无状态的是非常适用的。
2.服务是"幂等"的,重复调用不会产生副作用
这个幂等可以简单为多次执行,并不会影响到最初达到的效果。
比如说个人查询,查询多次的话,效果是相同的。具体幂等可以百度一下,不过觉的看下https://baike.baidu.com/item/%E5%B9%82%E7%AD%89/8600688?fr=aladdin就够了,因为有些人讲的神乎其神。
具体场景:
服务闪断
部分节点不可用
在使用重试过程中,最好达到下面几个要求:
设置失败次数
设置有步长策略的失败等待间隔
设置降级响应
设置断路器
前面说过polly 是针对httpClientFactory 的扩展,那么其融合性其实是非常好的。
比如说,grpc当监听到AddTransientHttpErrorPolicy错误的时候,那么可以启动对应的策略进行重试,RetryAsync就是polly的扩展,里面设置重试次数20次。
services.AddGrpcClient<Helloworld.Greeter.GreeterClient>(options =>
{
options.Address = new Uri("https://localhost:5001");
}).ConfigurePrimaryHttpMessageHandler(provider =>
{
var handle = new SocketsHttpHandler();
handle.SslOptions.RemoteCertificateValidationCallback = (a, b, c, d) => true;
return handle;
}).AddTransientHttpErrorPolicy(p=>p.RetryAsync(20));
看下AddTransientHttpErrorPolicy,其实个人感觉RetryAsync倒是没有必要去看,看AddTransientHttpErrorPolicy 是为了知道啥时候会触发这个重试,以及知道如何去定义我们自己的Policy。
AddTransientHttpErrorPolicy:
public static IHttpClientBuilder AddTransientHttpErrorPolicy(
this IHttpClientBuilder builder,
Func<PolicyBuilder<HttpResponseMessage>, IAsyncPolicy<HttpResponseMessage>> configurePolicy)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (configurePolicy == null)
{
throw new ArgumentNullException(nameof(configurePolicy));
}
var policyBuilder = HttpPolicyExtensions.HandleTransientHttpError();
// Important - cache policy instances so that they are singletons per handler.
var policy = configurePolicy(policyBuilder);
builder.AddHttpMessageHandler(() => new PolicyHttpMessageHandler(policy));
return builder;
}
从名字中可以看到HandleTransientHttpError就是处理异常的。
public static PolicyBuilder<HttpResponseMessage> HandleTransientHttpError()
{
return Policy<HttpResponseMessage>.Handle<HttpRequestException>().OrTransientHttpStatusCode();
}
这里表示HttpRequestException 会触发,或者OrTransientHttpStatusCode一些状态码下会触发,看下OrTransientHttpStatusCode。
OrTransientHttpStatusCode:
public static PolicyBuilder<HttpResponseMessage> OrTransientHttpStatusCode(
this PolicyBuilder<HttpResponseMessage> policyBuilder)
{
if (policyBuilder == null)
throw new ArgumentNullException(nameof (policyBuilder));
return policyBuilder.OrResult(HttpPolicyExtensions.TransientHttpStatusCodePredicate);
}
查看HttpPolicyExtensions.TransientHttpStatusCodePredicate:
private static readonly Func<HttpResponseMessage, bool> TransientHttpStatusCodePredicate = (Func<HttpResponseMessage, bool>) (response => response.StatusCode >= HttpStatusCode.InternalServerError || response.StatusCode == HttpStatusCode.RequestTimeout);
这里面表示 HttpStatusCode.InternalServerError(500)和 HttpStatusCode.RequestTimeout(408) 会进行重试。
同样可以设置间隔时间进行重试:
services.AddGrpcClient<Helloworld.Greeter.GreeterClient>(options =>
{
options.Address = new Uri("https://localhost:5001");
}).ConfigurePrimaryHttpMessageHandler(provider =>
{
var handle = new SocketsHttpHandler();
handle.SslOptions.RemoteCertificateValidationCallback = (a, b, c, d) => true;
return handle;
}).AddTransientHttpErrorPolicy(p=>p.WaitAndRetryAsync(20,i=>TimeSpan.FromSeconds(2)));
还可以使用WaitAndRetryForever 表示一直重试,直到成功,看需求。
同样也可以自定义一些状态或者一些情况,做一些事情:
var reg = services.AddPolicyRegistry();
reg.Add("retryforever", Policy.HandleResult<HttpResponseMessage>(message =>
{
return message.StatusCode == System.Net.HttpStatusCode.Created;
}).RetryForever());
services.AddHttpClient("GreeterClient").AddPolicyHandlerFromRegistry("retryforever");
上面表示针对GreeterClient客户端,增加一些retryforever的处理策略。
后面会介绍这种策略架子是如何实现的,在细节篇。
那通过Polic就可以针对不同场景,进行定义不同的策略,做出一些相应。看项目需求,这里就不多介绍了,每个项目都不一样。
结
下一节polly熔断。
重新整理 .net core 实践篇————polly失败重试[三十四]的更多相关文章
- 重新整理 .net core 实践篇—————3种配置验证[十四]
前言 简单整理一些配置的验证. 正文 配置的验证大概分为3类: 直接注册验证函数 实现IValidteOptions 使用Microsoft.Extensions.Options.DataAnnota ...
- 重新整理 .net core 实践篇————依赖注入应用之援军[四]
前言 介绍第三方依赖注入框架Autofac,看看为我们解决什么问题. 下面介绍4个点: 命名注册 属性注册 aop 注入 子容器命名 正文 为什么我们需要使用第三方框架?第三方框架为我们做了什么?第三 ...
- 重新整理 .net core 实践篇—————服务与配置之间[十一二]
前言 前面基本介绍了,官方对于asp .net core 设计配置和设计服务的框架的一些思路.看下服务和配置之间是如何联系的吧. 正文 服务: public interface ISelfServic ...
- 重新整理 .net core 实践篇——— 权限中间件源码阅读[四十六]
前言 前面介绍了认证中间件,下面看一下授权中间件. 正文 app.UseAuthorization(); 授权中间件是这个,前面我们提及到认证中间件并不会让整个中间件停止. 认证中间件就两个作用,我们 ...
- 重新整理 .net core 实践篇—————日志系统之战地记者[十五]
前言 本节开始整理日志相关的东西.先整理一下日志的基本原理. 正文 首先介绍一下包: Microsoft.Extengsion.Logging.Abstrations 这个是接口包. Microsof ...
- 重新整理 .net core 实践篇—————工作单元模式[二十六]
前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...
- 重新整理 .net core 实践篇————配置应用[一]
前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...
- 重新整理 .net core 实践篇————熔断与限流[三十五]
前言 简单整理一下熔断与限流,跟上一节息息相关. 正文 polly 的策略类型分为两类: 被动策略(异常处理.结果处理) 主动策略(超时处理.断路器.舱壁隔离.缓存) 熔断和限流通过下面主动策略来实现 ...
- 重新整理 .net core 实践篇————依赖注入应用[二]
前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...
随机推荐
- Spring Cloud Gateway之全局过滤器在工作中的使用场景
一.使用注意事项 1.全局过滤器作用于所有的路由,不需要单独配置. 2.通过@Order来指定执行的顺序,数字越小,优先级越高. 二.默认全局拦截器的整体架构 三.实战场景,例如,校验token.记录 ...
- [网络编程之客户端/服务器架构,互联网通信协议,TCP协议]
[网络编程之客户端/服务器架构,互联网通信协议,TCP协议] 引子 网络编程 客户端/服务器架构 互联网通信协议 互联网的本质就是一系列的网络协议 OSI七层协议 tcp/ip五层模型 客户端/服务器 ...
- docker容器与容器的关联
可以通过docker run -it -d --link 容器id 镜像id 方式关联 例如,将springboot项目容器与mysql容器相互关联,让springboot容器可以访问到mysql ...
- 【Azure 云服务】Azure Cloud Service 创建 Alert 指南 [基于旧版 Alert(Classic)不可用情况下]
问题描述 在Azure云服务(Cloud Service)创建Alert(Classic)时候遇见失败消息:"Failed to update alert testclassicalertr ...
- 神奇的不可见空格<200b>导致代码异常
故事是这样发生的,在做一个JSON对象转化的时候,出现了转化异常:刚开始还是以为是格式错误,后来一步步排除,才发现是不可见空格<200b>导致的解析异常 出现 使用Typora编写文字时, ...
- 针对Tab键不能使用解决办法(Linux系统)
Tab键在装Linux操作系统时,最小化安装没有安装能使用Tab键的安装包,Tab键就无法使用,但命令和本该有的目标也有. 这时就需要安装bash-completion包.,废话不多说,直接上! 一. ...
- flink Checkpoint优化
一.设置最小时间间隔 当flink应用开启Checkpoint功能,并配置Checkpoint时间间隔,应用中就会根据指定的时间间隔周期性地对应用进行Checkpoint操作.默认情况下Checkpo ...
- Java基础语法,常用知识复习
1.开发环境搭建 1.1JDK.JRE.JVM.的关系 JDK = JRE + 开发工具集(例如javac编译工具集等) JRE = JVM + Java SE 标准类库 2.基本语法 2.1.jav ...
- 重新整理 .net core 实践篇————配置系统——军令(命令行)[六]
前言 前文已经基本写了一下配置文件系统的一些基本原理.本文介绍一下命令行导入配置系统. 正文 要使用的话,引入Microsoft.extensions.Configuration.commandLin ...
- JavaSE-QuickStart
老话常说:基础不牢地动山摇,于是我在b站上看杨中科老师的课程脑补一下,便记录这岁月的点滴 1.什么是编程 ? 编程:编写能够控制计算机来执行特定任务的代码. 2.什么是编程语言 ? 编程语言:是指程序 ...