【微服务】04-Polly实现失败重试和限流熔断

news/2024/5/19 23:43:38 标签: 微服务, .netcore, 后端, 开发语言

文章目录

    • 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组件包

  • Polly
  • Polly.Extensions.Http
  • Microsoft.Extensions.Http.Polly

1.2 Polly的能力

  • 失败重试
  • 服务熔断 ⇒ 部分服务不可用时,可以快速响应熔断,避免持续请求不可用服务而导致整个应用程序宕掉
  • 超时处理 ⇒ 请求响应超过设置的时间,可按照预定的操作进行处理
  • 舱壁隔离 ⇒ 为服务定义最大流量和队列,避免服务应请求量过大而被压崩
  • 缓存策略 ⇒ 类似AOP为应用嵌入缓存机制,当缓存命中时可以快速响应缓存
  • 失败降级 ⇒ 当服务不可用时可以响应一个更友好的结果而非报错
  • 组合策略 ⇒ 将上面的策略组合在一起

1.3 Polly使用步骤

  • 定义要处理的异常类型或返回值
  • 定义要处理动作(重试、熔断、降级响应等)
  • 使用定义的策略来执行代码

1.4 适合失败重试的场景

  • 服务“失败”是暂时的,可自愈的
  • 服务是幂等的,重复调用不会有副作用

场景举例

  • 网络闪断
  • 部分服务节点异常

1.5 最佳实践

  • 设置失败重试次数
  • 设置带有步长策略的失败等待间隔 ⇒ 防止持续不断的重试,出现类似DDOS的情况
  • 设置降级响应 ⇒ 重试达到上限时,需要为服务设置降级响应
  • 设置断路器
 public void ConfigureServices(IServiceCollection services)
 {
 	// HttpClientFactory Polly内置的重试策略
	services.AddGrpcClient<OrderGrpc.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.HandleResult<HttpResponseMessage>(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.Get<IAsyncPolicy<HttpResponseMessage>>("retryforever") : Policy.NoOpAsync<HttpResponseMessage>();
     });
 }

2.Polly实现熔断限流避免雪崩效应

2.1 策略类型

  • 被动策略(异常处理,结果处理)
  • 主动策略(超时处理,断路器,舱壁隔离,缓存)

被动策略:当服务响应出现一些异常或结果时进行处理
主动策略:根据策略实例去判断是否超时或异常等情况,这是由策略进行主动触发的一些操作

2.2 组合策略

  • 降级响应
  • 失败重试
  • 断路器
  • 舱壁隔离
    在这里插入图片描述

限流、熔断策略都是有状态的,这指的是在策略中设置的并发数,队列数,还有熔断的采样时间和吞吐量,错误数这些计数器的状态,这些是由一个策略的实例去承载。在对不同服务进行不同的策略定义,单独计算它的熔断限流数值时,就需要单独定义不同的策略的实例,去完成不同服务之间的定义的隔离

// startup
public void ConfigureServices(IServiceCollection services)
{
	// 熔断策略
	services.AddHttpClient("orderclientv3").AddPolicyHandler(Policy<HttpResponseMessage>.Handle<HttpRequestException>().CircuitBreakerAsync(
                handledEventsAllowedBeforeBreaking: 10,// 报错10次后熔断服务
                durationOfBreak: TimeSpan.FromSeconds(10), // 熔断时间
                onBreak: (r, t) => { }, // 发生熔断后触发事件
                onReset: () => { }, // 熔断恢复后触发事件
                onHalfOpen: () => { }// 当熔断恢复之前进行验证服务是否可用的请求
                ));
}

//更高级设置
services.AddHttpClient("orderclientv3").AddPolicyHandler(Policy<HttpResponseMessage>.Handle<HttpRequestException>().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 = Policy<HttpResponseMessage>.Handle<BrokenCircuitException>().FallbackAsync(message);

// 重试机制,重试3次,每次等1秒钟
var retry = Policy<HttpResponseMessage>.Handle<Exception>().WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(1));

// 组合策略
//执行顺序breakPolicy -> retry -> fallback
var fallbackBreak = Policy.WrapAsync(fallback, retry, breakPolicy);
services.AddHttpClient("httpv3").AddPolicyHandler(fallbackBreak);

// 限流
var bulk = Policy.BulkheadAsync<HttpResponseMessage>(
	// 最大请求数
	maxParallelization: 30, 
	
	// 最大队列数,指的是达到最大请求数后又多少个请求可以被放到队列中;
	// 若不设置这个值,达到最大请求数后程序会抛出异常,如果队列数超出最大队列数,也会抛出异常
    maxQueuingActions: 20, 
    // 请求被限流时执行的处理方式
    onBulkheadRejectedAsync: contxt => Task.CompletedTask
   );

// 限流出现异常时,响应降级
var message2 = new HttpResponseMessage()
{
   Content = new StringContent("{}")
};
var fallback2 = Policy<HttpResponseMessage>.Handle<BulkheadRejectedException>().FallbackAsync(message);
// 组合策略
var fallbackbulk = Policy.WrapAsync(fallback2, bulk);
services.AddHttpClient("httpv4").AddPolicyHandler(fallbackbulk);


当服务发生熔断时,策略会抛出CircuitBreakerException异常,也就是熔断异常


http://www.niftyadmin.cn/n/4969971.html

相关文章

香港服务器怎么打开SSH

​  SSH是一种远程登录协议&#xff0c;可以通过加密方式在网络上安全地传输数据。它允许用户在远程服务器上执行命令&#xff0c;管理文件和目录&#xff0c;并进行其他系统管理任务。 如何打开SSH服务? 1.确认已安装OpenSSH服务器&#xff1a; 你可以通过命令sudoapt-geti…

【电路设计】220V AC转低压DC电路概述

前言 最近因项目需要,电路板上要加上一个交流220V转低压直流,比如12V或者5V这种。一般来说,比较常见也比较简单的做法是使用一个变压器将220V AC进行降压,比如降到22V AC,但是很遗憾的是,支持220V的变压器一般体积很大,而板子留给电源部分的面积又非常有限,所以不得不研…

2023山东近视防控展,护眼产品展,中国眼视光展11月举办

山东中国眼博会&#xff1a;呵护好孩子的眼睛&#xff0c;给他们一个光明的未来 2023第6届中国&#xff08;济南&#xff09;国际青少年眼健康产业展览会&#xff08;CEYEE中国眼博会&#xff09; The 2023 sixth China (Jinan) International Youth eye health industry exhi…

cuda11.1和cuDNN v8.8.1的安装目录问题

cuda的不同版本文件路径是不一致的&#xff0c;在cuda10.1中&#xff0c;配置cudnn的文件路径是&#xff1a; sudo cp cuda/include/cudnn.h /usr/local/cuda-10.1/include/ sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda-10.1/lib64/但是在cuda11.1中&#xff0c;文件路径…

计算机竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

Nginx的HTTPS部署与安全性能优化

Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;被广泛用于应用部署和负载均衡。在安全环保意识的逐渐提高下&#xff0c;HTTPS也成为现代Web应用中必不可少的一环。本篇文章将重点介绍Nginx的HTTPS部署和安全性能优化。 一、Nginx的HTTPS部署 证书申请 首先需要去…

Verilog 实现超声波测距

Verilog 实现超声波测距 教学视频&#xff1a; https://www.bilibili.com/video/BV1Ve411x75W?p33&spm_id_frompageDriver&vd_source19ae31dff4056e52d2729a4ca212602b 超声波测距原理 参考资料&#xff1a;STM32的超声波测距程序_超声波测距stm32程序_VaderZhang的…

maven可用的插件列表

maven可用的插件列表&#xff1a;https://maven.apache.org/plugins/ 在插件列表页面找到自己想要了解的插件&#xff0c;点击进去&#xff0c;可以看到插件的详细信息&#xff0c;例如这个插件有哪些goals&#xff0c;goal的参数、用法、样例等&#xff0c;还是很有用的。 B…