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

news2024/11/15 20:13:40

文章目录

    • 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.coloradmin.cn/o/929707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MaBatis中的分页插件以及特殊字符处理

目录 一、PageHelper介绍 二、PageHelper使用 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 配置sql映射文件 测试代码 特殊字符处理 2. 使用CDATA 区段 一、PageHelper介绍 PageHelper 是 Mybatis 的一个插件&#xff0c;这里就不扯了&#xff0c;就是为了更加便捷的进…

记录一次“top负1”比赛经历

获奖啦&#xff01; 比赛题目&#xff1a;中文语义病句识别与纠正挑战赛 比赛链接&#xff1a;https://challenge.xfyun.cn/topic/info?typeidentification-and-correction&optionphb“请介绍你们团队” “各位评委老师&#xff0c;我是来自WOT团队的选手AMBT&#xff0…

Python|爬虫和测试|selenium框架的安装和初步使用(一)

前言&#xff1a; Python作为一门胶水语言来说&#xff0c;可以说是十分的优秀&#xff0c;什么事情都可以干&#xff0c;并且在某些领域还能干的非常不错&#xff0c;尤其是在爬虫和测试领域&#xff0c;该语言可以说是没有对手。 这么说的原因是因为如果你要使用爬虫爬取某…

4.网络设计与redis、memcached、nginx组件(二)

系列文章目录 第四章 网络设计与redis、memcached、nginx组件(一) 第五章 网络设计与redis、memcached、nginx组件(二) 文章目录 系列文章目录[TOC](文章目录) 前言一、reactor模型&#xff1f;二、Reactor 开发1.建立连接 三、典型reactor 模型单reactor 模型典型 readisradi…

C++避坑——most vexing parse问题

1."坑"的问题是什么&#xff1f; 先看一段代码&#xff1a; class Functor { public:void operator()(){std::cout << "我是线程的初始函数" << std::endl;} };int main() {std::thread t(Functor());// 强制高速编译器这是一个构造函数!t.j…

Linux:权限

目录 一、shell运行原理 二、权限 1.权限的概念 2.文件访问权限的相关设置方法 三、常见的权限问题 1.目录权限 2.umsk(权限掩码) 3.粘滞位 一、shell运行原理 1.为什么我们不是直接访问操作系统&#xff1f; ”人“不善于直接使用操作系统如果让人直接访问操作系统&a…

lnmp架构-nginx

6.nginx基础配置 证书 重定向&#xff08;80重定向到443&#xff09; 当访问http时 直接到 https 自动索引&#xff1a; 下载方便 Nginx缓存配置 &#xff1a;缓存可以降低网站带宽&#xff0c;加速用户访问 日志轮询 禁用不必要的日志记录 以节省磁盘IO的消耗 监控的信息 监…

基于Android的垃圾分类系统 微信小程序 uniapp

随着网络科技的发展&#xff0c;移动智能终端逐渐走进人们的视线&#xff0c;相关应用越来越广泛&#xff0c;并在人们的日常生活中扮演着越来越重要的角色。因此&#xff0c;关键应用程序的开发成为影响移动智能终端普及的重要因素&#xff0c;设计并开发实用、方便的应用程序…

多态(C++)

多态 一、初识多态概念“登场”1>. 多态的构成条件2>. 虚函数3>. 虚函数重写&#xff08;覆盖&#xff09;4>. 虚函数重写的两个例外1. 协变 一 基类和派生类虚函数返回值类型不同2. 析构函数重写&#xff08;基类和派生类析构函数名不同&#xff09; 小结 二、延伸…

JavaScript函数调用其他函数

在JavaScript中&#xff0c;函数可以调用其他函数。这通常被称为函数组合&#xff0c;它允许你通过将较简单的函数组合在一起来创建更复杂的功能。 例如&#xff1a;还是以之前的水果加工举例&#xff0c;但是现在我们需要输出&#xff0c;这个苹果有几块&#xff0c;橘子有几块…

微信小程序分享后真机参数获取不到和部分参数不能获取问题问题解决

微信小程序的很多API&#xff0c;都是BUG&#xff0c;近期开发小程序就遇到了分享后开发工具可以获取参数&#xff0c;但是真机怎么都拿不到参数的问题 一、真机参数获取不到问题解决 解决方式&#xff1a; 在onLoad(options) 中。 onLoad方法中一定要有options 这个参数。…

【论文解读】基于图的自监督学习联合嵌入预测架构

一、简要介绍 本文演示了一种学习高度语义的图像表示的方法&#xff0c;而不依赖于手工制作的数据增强。论文介绍了基于图像的联合嵌入预测架构&#xff08;I-JEPA&#xff09;&#xff0c;这是一种用于从图像中进行自监督学习的非生成性方法。I-JEPA背后的idea很简单&#xff…

博客写作神器:介绍与部署Markdown Nice

作为开发者和写作者&#xff0c;我们经常需要使用Markdown来编写文档、博客和技术文稿。然而&#xff0c;标准的Markdown格式可能显得有些普通&#xff0c;缺乏一些专业的排版效果。在这里&#xff0c;我们将向你介绍一个强大的工具——Markdown Nice&#xff08;mdnice&#x…

Android中的APK打包与安全

aapt2命令行实现apk打包 apk文件结构 classes.dex&#xff1a;Dex&#xff0c;即Android Dalvik执行文件 AndroidManifest.xml&#xff1a;工程中AndroidManifest.xml编译后得到的二进制xml文件 META-INF&#xff1a;主要保存各个资源文件的SHA1 hash值&#xff0c;用于校验…

开始MySQL之路——MySQL安装和卸载

MySQL的介绍 MySQL数据库管理系统由瑞典的DataKonsultAB公司研发&#xff0c;该公司被Sun公司收购&#xff0c;现在Sun公司又被Oracle公司收购&#xff0c;因此MySQL目前属于Oracle旗下产品。 MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权…

使用VSCode SSH实现公网远程连接本地服务器开发的详细教程

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

什么是Sui Kiosk,它可以做什么,如何赋能创作者?

创作者和IP持有者需要一些工具帮助他们在区块链上实现其商业模式。Sui Kiosk作为Sui上的一种原语可以满足这种需求&#xff0c;为创作者提供动态选项&#xff0c;使他们能够在任何交易场景中设置完成交易的条件。 本文将向您介绍为什么要在SuiFrens中使用Sui Kiosk&#xff0c…

数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

文章目录 前言一、单源最短路径1、单源最短路径问题2、Dijkstra 初始化a、参数b、初始化参数c、算法步骤 3、Dijkstra 算法详细步骤a、第一轮算法执行b、第二轮算法执行c、第三轮算法执行d、第四轮算法执行e、第五轮算法执行f、第六轮算法执行 4、java算法实现 二、多源最短路径…

怎么把pdf转换成jpg格式?

怎么把pdf转换成jpg格式&#xff1f;在我们日常的办公过程中&#xff0c;PDF文件是一个经常被使用来传输文件的格式。它能够确保我们的文件内容不会混乱&#xff0c;并以更加完美的方式呈现出来。然而&#xff0c;PDF文件也存在一些缺陷。例如&#xff0c;它无法直接编辑&#…

Win10下CCS v5.2.1编译错误Fatal error: could not open source file问题记录

Win10下CCS v5.2.1编译错误Fatal error: could not open source file问题记录 1.问题现象 作者在Win 10系统中使用CCS v5.2.1进行DSP C6678开发&#xff0c;由于更换了新的电脑&#xff0c;所以重新配置了开发环境&#xff0c;但是编译出现错误。输出如下&#xff1a; **** …