前言

简单整理一下熔断与限流,跟上一节息息相关。

正文

polly 的策略类型分为两类:

  1. 被动策略(异常处理、结果处理)

  2. 主动策略(超时处理、断路器、舱壁隔离、缓存)

熔断和限流通过下面主动策略来实现:

  1. 降级响应

  2. 失败重试

  3. 断路器

  4. 舱壁隔离

Policy 类型 状态 说明
CircuitBreaker(断路器) 有状态 共享失败率,以决定是否熔断
Bulkhead(舱壁隔离) 有状态 共享容量使用情况,以决定是否执行动作
Cache(缓存) 有状态 共享缓存的对象,以决定是否命中
其他策略 无状态

先来看一下熔断,什么是熔断呢?

熔断就是让我们的上游服务器一段时间内对下游服务器不进行调用。

这里解释一下上游服务器和下游服务器,比如说A调用B,那么A就是上游服务器,B就是下游服务器。

那么为什么要熔断呢?比如说A调用B,现在A调用B 10次有8次是错误的,那么这个时候就要想一件事,代码没有变过,那么肯定是量变成了质变。

这时候B之所以不可用,那么是因为请求太多了,处理不过来(比如内存升高了,io 99%了等)。

那么这个时候A就不进行调用了,隔一段时间后再进行调用。也就是A对B的这条线进行了熔断处理。

services.AddHttpClient("GreeterClient").AddPolicyHandler(Policy<HttpResponseMessage>
.Handle<HttpRequestException>().CircuitBreakerAsync(handledEventsAllowedBeforeBreaking: 10,
durationOfBreak: TimeSpan.FromSeconds(10),
onBreak: (r, t) =>
{
// 熔断的时候处理事件
},
onReset: () =>
{
// 恢复的时候的处理
},onHalfOpen: () =>
{
// 恢复之前进行处理
}));

CircuitBreakerAsync 表示断路器,这个用来实现熔断的。

handledEventsAllowedBeforeBreaking 表示失败10次,进行熔断。

durationOfBreak 熔断的事件

其他几个事件上面做了备注。

其实上面这种不常用,因为限制比较死,比如说10次就熔断。

一般都是百分比来计算的。

services.AddHttpClient("GreeterClient").AddPolicyHandler(Policy<HttpResponseMessage>
.Handle<HttpRequestException>().AdvancedCircuitBreakerAsync(
failureThreshold:0.8,
samplingDuration:TimeSpan.FromSeconds(10),
minimumThroughput:100,
durationOfBreak: TimeSpan.FromSeconds(10),
onBreak: (r, t) =>
{
// 熔断的时候处理事件
},
onReset: () =>
{
// 恢复的时候的处理
}, onHalfOpen: () =>
{
// 恢复之前进行处理
}));

failureThreshold 表示失败的比例

samplingDuration 表示失败的时间

failureThreshold 和 samplingDuration一般是组合起来用的,表示是10秒内失败次数要有80%就会熔断。

minimumThroughput 表示10秒类必须有100个请求才会出根据其他的条件进行熔断判断。

上面就是熔断了,那么什么是服务降级呢?

网上的一段话是这样的:服务降级是指 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心业务正常运作或高效运作。

这段话的感觉好像是关闭某些服务一样,而且比较绕。

个人理解是服务降级是指降低了原有的服务体验,都属于服务降级。

熔断其实也是一种服务降级,但是单纯的熔断就降级的有点厉害了。

比如我去买东西,然后店直接关门了,服务体验下降了,体验降得比较厉害。

但是如果去买东西,店没有关闭,而是有一排服务员,告诉你现在因为供销商没到货买不到了,这体验是不是好点,这也是服务降级。

那么就看下第二种情况的服务降级怎么实现吧。

var breakPolicy = Policy<HttpResponseMessage>
.Handle<HttpRequestException>().AdvancedCircuitBreakerAsync(
failureThreshold: 0.8,
samplingDuration: TimeSpan.FromSeconds(10),
minimumThroughput: 100,
durationOfBreak: TimeSpan.FromSeconds(10),
onBreak: (r, t) =>
{
// 熔断的时候处理事件
},
onReset: () =>
{
// 恢复的时候的处理
}, onHalfOpen: () =>
{
// 恢复之前进行处理
}); var message = new HttpResponseMessage()
{
Content = new StringContent("不要慌,老板没有跑路,只是和老婆的妹妹出去了,要等一下!")
}; var fallback = Policy<HttpResponseMessage>.Handle<BrokenCircuitException>().FallbackAsync(message); var fallbackBreak = Policy.WrapAsync(fallback, breakPolicy); services.AddHttpClient("GreeterClient").AddPolicyHandler(fallbackBreak);

上面代码就是当熔断后,过来的请求会有BrokenCircuitException异常,那么捕获到BrokenCircuitException异常,那么就告诉用户店没有倒闭,等一下就好。

这种就是比较优雅的降级。

上面这种var fallbackBreak = Policy.WrapAsync(fallback, breakPolicy); 就是将几个policy组合在一起,然后给某个或者某些HttpClient 增加该组合策略,比如Policy.WrapAsync(fallback, breakPolicy,xxx,yyy)等。

接下来解释一下限流。

为什么要限流呢? 如果没有限流其实熔断的意义是不大的。

为什么这么说呢? 比如说公司有1百万请求,然后这个时候熔断了,但是这100w请求还在啊,只有恢复服务,服务器又要进行熔断,一下子就瞬间爆炸。

var bulk = Policy.BulkheadAsync<HttpResponseMessage>(
maxParallelization:30,
maxQueuingActions:20,
onBulkheadRejectedAsync:context=>Task.CompletedTask); var message = new HttpResponseMessage()
{
Content = new StringContent("你没有抢到号码,下次再来。")
}; var fallbackBulk = Policy<HttpResponseMessage>.Handle<BulkheadRejectedException>().FallbackAsync(message); var fallbackBreak = Policy.WrapAsync(bulk, fallbackBulk);

上面这个就是限流了。

maxParallelization 表示可以并发处理30个请求,maxQueuingActions表示如果并发处于30,那么会加入到队列中,队列中最大能存20个。

如果队列中也存不下,那么就会抛出BulkheadRejectedException这种拒绝异常,一但出现异常,第二个策略就捕获到了,然后给出一些友好的提示。

下一节,网关。

重新整理 .net core 实践篇————熔断与限流[三十五]的更多相关文章

  1. 重新整理 .net core 实践篇——— 权限源码阅读四十五]

    前言 简单介绍一下权限源码阅读一下. 正文 一直有人对授权这个事情上争论不休,有的人认为在输入账户密码给后台这个时候进行了授权,因为认为发送了一个身份令牌,令牌里面可能有些用户角色信息,认为这就是授权 ...

  2. 重新整理 .net core 实践篇—————配置系统之强类型配置[十]

    前言 前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式. 这种形式有一个不好的 ...

  3. 重新整理 .net core 实践篇—————日志系统之结构化[十八]

    前言 什么是结构化呢? 结构化,就是将原本没有规律的东西进行有规律话. 就比如我们学习数据结构,需要学习排序然后又要学习查询,说白了这就是一套,没有排序,谈如何查询是没有意义的,因为查询算法就是根据某 ...

  4. 重新整理 .net core 实践篇————配置应用[一]

    前言 本来想整理到<<重新整理.net core 计1400篇>>里面去,但是后来一想,整理 .net core 实践篇 是偏于实践,故而分开. 因为是重新整理,那么就从配置开 ...

  5. .Net Core微服务——Ocelot(3):超时、熔断、限流

    基本概念 超时.熔断.限流听起来好像很远,但实际上用在方方面面.很多人可能还搞不懂熔断是做什么,其实可以把熔断理解为一种防护措施.做个假设,在微服务体系下,某个下游服务响应很慢,然后随着时间推移,会有 ...

  6. spring cloud 2.x版本 Gateway熔断、限流教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  7. 降级、熔断、限流[z]

    [z]https://juejin.im/post/5cced96e6fb9a032514bbf94当我们的系统的访问量突然剧增,大量的请求涌入过来,最典型的就是秒杀业务了,我们可能会知道会有一波高峰 ...

  8. 重新整理 .net core 实践篇————polly失败重试[三十四]

    前言 简单整理一下polly 重试. 正文 在开发程序中一般都有一个重试帮助类,那么polly同样有这个功能. polly 组件包: polly 功能包 polly.Extensions.Http 专 ...

  9. 重新整理 .net core 实践篇————依赖注入应用[二]

    前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...

随机推荐

  1. 探索GaussDB(DWS)的过程化SQL语言能力

    摘要:在当前GaussDB(DWS)的能力中主要支持两种过程化SQL语言,即基于PostgreSQL的PL/pgSQL以及基于Oracle的PL/SQL.本篇文章我们通过匿名块,函数,存储过程向大家介 ...

  2. [Linux] Linux C编程一站式学习 Part.1

    C语言入门 程序基本概念 程序和编程语言 C语言--(编译器)--汇编语言--(汇编器)--机器语言(目标代码 / 可执行代码) 可移植 / 平台无关:平台指计算机体系结构或操作系统,或二者的组合.不 ...

  3. 消息队列之 RabbitMQ【验证通过】

    消息队列之 RabbitMQ 预流 关注  22.9 2017.05.06 16:03* 字数 4884 阅读 284691评论 41喜欢 618赞赏 2 关于消息队列,从前年开始断断续续看了些资料, ...

  4. 强哥CSS学习笔记

    html嵌套css样式:1.外部(推荐)2.内部3.内联(不推荐) css优先级1.内联2.id选择器3.class选择器4.标签 css长度单位:1.px2.em (14px) css选择器:常用选 ...

  5. 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM"

    linux查看目录下所有文件内容中是否包含某个字符串 2017-07-25 15:13:22 默一鸣 阅读数 21556 文章标签: linux查找文件夹文件内容字符串 更多 分类专栏: Unix   ...

  6. Java 运行 Jar 包中java -cp 与 java jar 的区别

    java -cp java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库和jar包,需要全路径到jar包,多个jar包之间连接符:window上分号"; ...

  7. GLSL着色器,来玩

    对实现动画的前端同学们来说,canvas可以说是最自由,最能全面控制的一个动画实现载体.不但能通过javascript控制点.线.面的绘制,使用图片资源填充:还能改变输入参数作出交互动画,完全控制动画 ...

  8. hive的排序 order by和sort by

    在算法中,各个排序算法的复杂度都比较高,正常情况下为O (nlogn) ,所以当数据量特别大的时候,对数组进行排序消耗都很大. 因为hive的计算引擎MapReduce是分布式系统, 利用分布式的特点 ...

  9. mysql数据库-备份与还原-Percona XtraBackup 2.4备份工具使用

    目录 xtrabackup 特点 备份生成的相关文件 xtrabackup 安装 xtrabackup 用法 1 备份 2 预备份 3 还原 4 其他 还原注意事项 xtrabackup实现完全备份及 ...

  10. 直击Huawei Mate 40产线背后的华为云IoT智能制造

    摘要:数字孪生?在数字世界找到物理世界的设备! 本文分享自华为云社区<[云驻共创]Huawei Mate 40产线直击之华为云IoT智能制造助力工厂数字化转型>,原文作者:启明. Part ...