手机下载视频网站模板下载失败,杭州做网站五,一个网站的主题和设计风格,在网上做黑彩网站会怎样文章目录 1. Polly实现失败重试1.1 Polly组件包1.2 Polly的能力1.3 Polly使用步骤1.4 适合失败重试的场景1.5 最佳实践 2.Polly实现熔断限流避免雪崩效应2.1 策略类型2.2 组合策略 1. Polly实现失败重试
1.1 Polly组件包
PollyPolly.Extensions.HttpMicrosoft.Extensions.Htt… 文章目录 1. Polly实现失败重试1.1 Polly组件包1.2 Polly的能力1.3 Polly使用步骤1.4 适合失败重试的场景1.5 最佳实践 2.Polly实现熔断限流避免雪崩效应2.1 策略类型2.2 组合策略 1. Polly实现失败重试
1.1 Polly组件包
PollyPolly.Extensions.HttpMicrosoft.Extensions.Http.Polly
1.2 Polly的能力
失败重试服务熔断 ⇒ 部分服务不可用时可以快速响应熔断避免持续请求不可用服务而导致整个应用程序宕掉超时处理 ⇒ 请求响应超过设置的时间可按照预定的操作进行处理舱壁隔离 ⇒ 为服务定义最大流量和队列避免服务应请求量过大而被压崩缓存策略 ⇒ 类似AOP为应用嵌入缓存机制当缓存命中时可以快速响应缓存失败降级 ⇒ 当服务不可用时可以响应一个更友好的结果而非报错组合策略 ⇒ 将上面的策略组合在一起
1.3 Polly使用步骤
定义要处理的异常类型或返回值定义要处理动作(重试、熔断、降级响应等)使用定义的策略来执行代码
1.4 适合失败重试的场景
服务“失败”是暂时的可自愈的服务是幂等的重复调用不会有副作用
场景举例
网络闪断部分服务节点异常
1.5 最佳实践
设置失败重试次数设置带有步长策略的失败等待间隔 ⇒ 防止持续不断的重试出现类似DDOS的情况设置降级响应 ⇒ 重试达到上限时,需要为服务设置降级响应设置断路器 public void ConfigureServices(IServiceCollection services){// HttpClientFactory Polly内置的重试策略services.AddGrpcClientOrderGrpc.OrderGrpcClient(options {options.Address new Uri(https://localhost:5001);}).ConfigurePrimaryHttpMessageHandler(provider {var handler new SocketsHttpHandler();handler.SslOptions.RemoteCertificateValidationCallback (a, b, c, d) true; //允许无效、或自签名证书return handler;}).AddTransientHttpErrorPolicy(p p.WaitAndRetryForeverAsync(i TimeSpan.FromSeconds(i * 3)));// 设置响应500或408时重试不指定次数直到成功// 定义个性化策略var reg services.AddPolicyRegistry();reg.Add(retryforever, Policy.HandleResultHttpResponseMessage(message {return message.StatusCode System.Net.HttpStatusCode.Created;}).RetryForeverAsync());// 应用策略services.AddHttpClient(orderclient).AddPolicyHandlerFromRegistry(retryforever);services.AddHttpClient(orderclientv2).AddPolicyHandlerFromRegistry((registry, message) {return message.Method HttpMethod.Get ? registry.GetIAsyncPolicyHttpResponseMessage(retryforever) : Policy.NoOpAsyncHttpResponseMessage();});}
2.Polly实现熔断限流避免雪崩效应
2.1 策略类型
被动策略(异常处理结果处理)主动策略超时处理断路器舱壁隔离缓存
被动策略当服务响应出现一些异常或结果时进行处理 主动策略根据策略实例去判断是否超时或异常等情况这是由策略进行主动触发的一些操作
2.2 组合策略
降级响应失败重试断路器舱壁隔离 限流、熔断策略都是有状态的这指的是在策略中设置的并发数队列数还有熔断的采样时间和吞吐量错误数这些计数器的状态这些是由一个策略的实例去承载。在对不同服务进行不同的策略定义单独计算它的熔断限流数值时就需要单独定义不同的策略的实例去完成不同服务之间的定义的隔离 // startup
public void ConfigureServices(IServiceCollection services)
{// 熔断策略services.AddHttpClient(orderclientv3).AddPolicyHandler(PolicyHttpResponseMessage.HandleHttpRequestException().CircuitBreakerAsync(handledEventsAllowedBeforeBreaking: 10,// 报错10次后熔断服务durationOfBreak: TimeSpan.FromSeconds(10), // 熔断时间onBreak: (r, t) { }, // 发生熔断后触发事件onReset: () { }, // 熔断恢复后触发事件onHalfOpen: () { }// 当熔断恢复之前进行验证服务是否可用的请求));
}//更高级设置
services.AddHttpClient(orderclientv3).AddPolicyHandler(PolicyHttpResponseMessage.HandleHttpRequestException().AdvancedCircuitBreakerAsync(// 请求失败比例占80%时熔断failureThreshold: 0.8,// 计算请求失败比例的时间范围,当前为10秒内80%请求失败samplingDuration: TimeSpan.FromSeconds(10),// 最小吞吐量,在达到100个请求的时候再去计算上去失败比例,用于请求量小的时候不进行熔断minimumThroughput: 100,durationOfBreak: TimeSpan.FromSeconds(20),// 熔断时长onBreak: (r, t) { }, // 发生熔断后触发事件onReset: () { },// 熔断恢复后触发事件onHalfOpen: () { }));// 当熔断恢复之前进行验证服务是否可用的请求// 服务降级
var message new HttpResponseMessage()
{Content new StringContent({})
};
var fallback PolicyHttpResponseMessage.HandleBrokenCircuitException().FallbackAsync(message);// 重试机制重试3次每次等1秒钟
var retry PolicyHttpResponseMessage.HandleException().WaitAndRetryAsync(3, i TimeSpan.FromSeconds(1));// 组合策略
//执行顺序breakPolicy - retry - fallback
var fallbackBreak Policy.WrapAsync(fallback, retry, breakPolicy);
services.AddHttpClient(httpv3).AddPolicyHandler(fallbackBreak);// 限流
var bulk Policy.BulkheadAsyncHttpResponseMessage(// 最大请求数maxParallelization: 30, // 最大队列数,指的是达到最大请求数后又多少个请求可以被放到队列中// 若不设置这个值,达到最大请求数后程序会抛出异常如果队列数超出最大队列数也会抛出异常maxQueuingActions: 20, // 请求被限流时执行的处理方式onBulkheadRejectedAsync: contxt Task.CompletedTask);// 限流出现异常时响应降级
var message2 new HttpResponseMessage()
{Content new StringContent({})
};
var fallback2 PolicyHttpResponseMessage.HandleBulkheadRejectedException().FallbackAsync(message);
// 组合策略
var fallbackbulk Policy.WrapAsync(fallback2, bulk);
services.AddHttpClient(httpv4).AddPolicyHandler(fallbackbulk);
当服务发生熔断时策略会抛出CircuitBreakerException异常也就是熔断异常