【微服务】04-Polly实现失败重试和限流熔断
文章目录
- 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异常,也就是熔断异常
相关文章:
【微服务】04-Polly实现失败重试和限流熔断
文章目录 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…...
如何使用HTML5新增的标签来构建语义化的页面结构?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ <header>:⭐ <nav>:⭐ <main>:⭐ <section>:⭐ <article>:⭐ <aside>:⭐ <footer>:⭐ <figure> 和 &l…...
Vmware 虚拟机挂起恢复后发现无法 Ping 通,无法连接到主机
解决办法 进入对应主机中,切换到 root 账户,重启网络服务。 systemctl stop NetworkManager systemctl restart network在网上还找到了另一种解决方法: 在网卡配置文件中增加参数 NM_CONTROLLED"no"。 在 Centos 7 中修改如下所…...
Web自动化测试之图文验证码的解决方案
对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码, 验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑…...
软考高级系统架构设计师系列论文九十:论分布式数据库的设计与实现
软考高级系统架构设计师系列论文九十:论分布式数据库的设计与实现 一、分布式数据库相关知识点二、摘要三、正文四、总结一、分布式数据库相关知识点 软考高级系统架构设计师系列之:分布式存储技术...
Day 84:网络结构与参数
单层数据 package dl;/*** One layer, support all four layer types. The code mainly initializes, gets,* and sets variables. Essentially no algorithm is implemented.*/ public class CnnLayer {/*** The type of the layer.*/LayerTypeEnum type;/*** The number of …...
vue2.6及以下版本导入 TDesign UI组件库
TDesign 官方文档:https://tdesign.tencent.com/vue/components/button 我们先打开一个普通的vue项目 然后 如果你是 vue 2.6 或者 低于 2.6 在终端执行 npm i tdesign-vue如果你是 2.7 或者更高 执行 npm i tdesign-vuenaruto这里 我们 以 2.6为例 因为大部分人 用vue2 都是…...
VR/AR/眼镜投屏充电方案(LDR6020)
VR眼镜即VR头显,也称虚拟现实头戴式显示设备,随着元宇宙概念的传播,VR眼镜的热度一直只增不减,但是头戴设备的续航一直被人诟病,如果增大电池就会让头显变得笨重影响体验,所以目前最佳的解决方案还是使用VR…...
区分什么是Java内存模型(JMM)和 JVM运行时数据区
文章目录 一、概念区分1、什么是内存模型?什么是(内存区域)运行时数据区?2、为什么要有Java内存模型?2.1、硬件的效率与一致性2.2、 CPU和缓存的一致性2.2.1、为什么需要CPU cache?2.2.2、三级缓存…...
Flask狼书笔记 | 04_表单
文章目录 4 表单4.1 HTML表单4.2 使用Flask-WTF4.3 处理表单数据4.4 表单进阶实践小记 4 表单 表单是和用户交互最常见的方式之一,本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。(p104) 4.1 HTML表单 通过<form>标签创建…...
RabbitMQ+springboot用延迟插件实现延迟消息的发送
延迟队列:其实就是死信队列中消息过期的特殊情况 延迟队列应用场景: 可以用死信队列来实现,不过死信队列要等上一个消息消费成功,才会进行下一个消息的消费,这时候就需要用到延迟插件了,不过要线在docker上…...
多线程和并发(1)—等待/通知模型
一、进程通信和进程同步 1.进程通信的方法 同一台计算机的进程通信称为IPC(Inter-process communication),不同计 算机之间的进程通信被称为 RPC(Romote process communication),需要通过网络,并遵守共同的协议。**进…...
浏览器的事件循环
其实在我们电脑的操作系统中,每一个运行的程序都会由自己的进程(可能是一个,也可能有多个),浏览器就是一个程序,它的运行在操作系统中,拥有一组自己的进程(主进程,渲染进…...
跳跃游戏 II【贪心算法】
跳跃游戏 II class Solution {public int jump(int[] nums) {int cur 0;//当前最大覆盖路径int next 0;//下一步的最大覆盖路径int res 0;//存放结果,到达终点时最少的跳跃步数for (int i 0; i < nums.length; i) {//遍历数组,以给出数组以一个…...
promise
promise 属于事件循环的微任务,具体详见:事件循环 Promise 语法: const p1 new Promise((reslove,reject)>{console.log(2);reslove(1) }).then((data)>{console.log(3);console.log(data) }).catch((data)>{console.log(3); }) promise.th…...
前端面试:【网络协议与性能优化】HTTP/HTTPS、TCP/IP和WebSocket
嗨,亲爱的Web开发者!在构建现代Web应用时,了解网络协议是优化性能和确保安全性的关键。本文将深入探讨HTTP/HTTPS、TCP/IP和WebSocket这三个网络协议,帮助你理解它们的作用以及如何优化Web应用的性能。 1. HTTP/HTTPS协议…...
设计模式之工厂模式(万字长文)
文章目录 概述工厂模式的优点包括工厂模式有几种主要的变体看一个具体需求使用传统的方式来完成传统的方式的优缺点 简单工厂模式基本介绍使用简单工厂模式简单工厂模式的优缺点优点:缺点: 工厂方法模式看一个新的需求思路 1思路 2工厂方法模式介绍工厂方…...
CNN 02(CNN原理)
一、卷积神经网络(CNN)原理 1.1 卷积神经网络的组成 定义 卷积神经网络由一个或多个卷积层、池化层以及全连接层等组成。与其他深度学习结构相比,卷积神经网络在图像等方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他浅层或深度神经…...
Android View动画整理
View 动画相关内容可参考官网 动画资源 此前也有写 View 动画相关的内容,但都只是记录代码,没有特别分析。以此篇作为汇总、整理、分析。 Android View 动画有4中,分别是 平移动画 TranslateAnimation缩放动画 ScaleAnimation旋转动画 Rot…...
阿里云架构
负载均衡slb 分类以及应用场景 负载均衡slb clb 传统的负载均衡(原slb) 支持4层和7层(仅支持对uri(location),域名进行转发) 一般使用slb(clb) alb 应用负载均衡 只支持7层,整合了nginx负载均衡的各种功能,可以根据用户请求头,响应头 如果需要详细处理用户请求(浏…...
【C语言】操作符大全(保姆级介绍)
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将详细介绍各种操作符的功能。 目录: 📘 前言① 算术操作符②移位操作符③位操作符④赋值操…...
ruoyi-cloud部署
默认你已经安装mysql,nacos,seata,sentinel等(没有的可以先找教程安装) 1、下载源码:git clone https://gitee.com/zhangmrit/ruoyi-cloud 2、项目依赖导入,选择自己的maven环境等,创…...
Vue3(开发h5适配)
在开发移动端的时候需要适配各种机型,有大的,有小的,我们需要一套代码,在不同的分辨率适应各种机型。 因此我们需要设置meta标签 <meta name"viewport" content"widthdevice-width, initial-scale1.0">…...
图的存储:邻接矩阵法
1.邻接矩阵的实现 邻接矩阵的定义:在无向图和有向图中,使用二维数组表示各个顶点的相邻情况:1代表相邻,0表示不相邻。 代码实现: #define MaxVertexNum 100//顶点数目的最大值 typedef struct {char Vex [MaxVertexN…...
如何优雅的使用Git?
第一部分:Git的基本概念和初始设置 Git是一个分布式版本控制系统,它允许多人共同工作,同时跟踪和管理项目的版本历史。使用Git,您可以恢复旧版本、创建新分支进行实验,并与其他开发者进行协作,而不会影响主…...
【【STM32分析IO该设置什么模式的问题】】
STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…...
飞天使-k8s基础组件分析-服务与ingress
文章目录 服务的介绍服务代理服务发现连接集群外服务服务发布无头服务 服务,pod和dns的关系端口转发通过expose 暴露应用服务案例INGRESSMetalLB使用参考文档 服务的介绍 服务的作用是啥? 提供外部调用,保证podip的真实性看看服务解决了什么…...
Unity——拖尾特效
拖尾是一种很酷的特效。拖尾的原理来自人类的视觉残留:观察快速移动的明亮物体,会看到物体移动的轨迹。摄像机通过调整快门时间,也可以拍出具有拖尾效果的照片,如在城市的夜景中,汽车的尾灯拖曳出红色的线条。 在较老…...
java开发之fastjson
依赖 <!-- fastjson依赖 --> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> <…...
第一个C语言程序:HelloWorld
第一个C语言程序 注释 注释 对代码的解释和说明 特点 ○ 不会被执行 目的 让人们能够更加轻松地看懂代码 分类 行注释 // 快键键 ctrl/ 块注释 /**/ 快捷键 shiftalta 示例代码: #include <stdio.h>int main() {// 行注释/*块注释*/printf("hello w…...
wordpress管理员用户名更改/网站seo课设
今天安装了个伪分布式的hadoop。 参考如下文章代码。 https://blog.csdn.net/qq_36561697/article/details/80994405 我用的是vmvare安装,在csdn上找了个15.0版本的安装包,然后上vm官网下载15.3版本更新包,【因为19041版本的win10与之前的vmvare不兼容&…...
品牌授权/南京百度seo排名优化
近日,网络安全公司Palo Alto Networks威胁研究部门Unit 42发博称,已确认Cardinal RAT自2017年4月起对两家从事外汇和加密交易软件开发的以色列金融科技公司发起过攻击。 Cardinal RAT是可远程访问特洛伊木马(RAT),攻击…...
做网站是用什么语言的/免费十八种禁用网站
所谓帧定格 Frame Hold,就是获取视频中的某一静帧画面,这一静帧既可以作为素材文件添加到项目面板以备后用,也可直接附加在剪辑上构成定格效果。导出帧在节目面板或源面板的下方都有一个相机图标,用于“导出帧” Export Frame&…...
自建站怎么接入支付/拉新推广怎么找渠道
一、概述 原始视频帧(最原始的视频数据)根据编码的需要,以不同的方式进行扫描产生两种视频帧:连续或隔行视频帧,隔行视频帧包括顶场和底场,连续(遂行)扫描的视频帧与隔行扫描视频帧有…...
学校网站在哪里找/全网营销式网站
weboffice(点聚)在传参为汉字时的乱码问题 传递端:加上escape()。 例:document.all.WebOffice1.HttpAddPostString("DocTitle",escape(myform.txtTitle.value)); 接收端:Server.UrlDecode(); 例:…...
宝塔建站详细教程/今日竞彩足球最新比赛结果查询
大家好,今天我们学习【马上学tensorflow 2.0】之 神经网络的“齿轮”:张量运算。我们 马上学三点 ,张量运算介绍张量点积和几何意义深度学习几何意义大家可以点击下面的“ 了解更多 ”,或搜索“ 马上学123 ”,在线观看…...