降级&熔断&限流
⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记仓库👉https://github.com/A-BigTree/tree-learning-notes
个人主页👉https://www.abigtree.top
⭐⭐⭐⭐⭐⭐
如果可以,麻烦各位看官顺手点个star~😊
如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆
文章目录
- 降级&熔断&限流
- 1 前言
- 2 降级与熔断
- 3 限流降级
1 前言
什么是熔断,什么是降级,熔断与降级是同一个意思吗?
如上图所示,服务A
接收客户端请求,服务B
提供给内部服务调用,每个服务部署的节点数至少两个。
在事发之前的近一周,服务B
都一直运行正常,而事发的那晚请求量突增一倍,显然,此次事故与请求突增脱不了干系。因突增请求导致服务B
高负荷运转,超出临界点的请求最后超出设定的接口超时时间,再由于服务B
的一个隐藏性能问题导致内存消耗殆尽,进程开始频繁GC
,但服务A
还是不断地往服务B
发送请求,导致服务B
奔溃,服务B
的奔溃又直接导致服务A
崩溃,这种产生连带效应的服务奔溃称为服务雪崩。
2 降级与熔断
分析完事故后,我们再来说说熔断降级。熔断与降级不是一个概念,但熔断却伴随着降级,熔断在满足某种降级策略时触发,所以熔断是降级方式的一种,熔断是自动降级的一种实现。
做电商项目的朋友可能接触最多的就是服务降级,一般我们在搞大促之前,都会通过开关方式将一些无关紧要的业务接口变成“不可用”。例如,通过配置中心或者通过Redis
控制服务降级开关,当开关打开时,需要降级的接口直接响应一个表达当前服务降级的状态码给调用端。
控制服务降级开关的方式可以是人工,也可以是定时任务在某个时段开启、某个时段关闭,这种降级方式称为开关降级。开关降级与熔断降级都属于服务降级,服务降级的目的都是确保服务以稳定状态运行,防止服务奔溃的出现。
熔断指的是,当服务A
的下游服务B
突然变得不可用或者不稳定时,服务A
可以自动切断与服务B
的交互从而保证自己可用,就像保险丝一样,当电流异常升高到一定高度的时候,保险丝切断电流,这就是熔断。
熔断需要条件触发,而这个触发条件就是我们设置的一种服务降级策略,例如,在每秒请求异常数超过多少时触发熔断、在每秒请求异常错误率超过多少时触发熔断、在每秒请求平均耗时超过多少时触发熔断。
熔断是切断请求,快速失败,在触发熔断时让服务A
不再访问服务B
,但这不是永久的。以某个资源(接口)采取平均每秒请求异常数超出5
个时熔断的策略为例,假设当前时间窗口(时间单位)已经发生5
个异常,那么当前时间窗口内的后续请求都会被熔断,但下一个时间窗口又会重新计算异常总数。
3 限流降级
服务降级除以上说到的开关降级和熔断降级外,还有一种常用的服务降级方式:限流降级。
限流是限制单位时间内处理的请求数,拦截请求做降级处理。例如,通过压测得到单个服务节点单位时间内所能处理的最大请求数,使用该数值做为降级条件,当并发处理的请求数超过这个数值时,超出的部分请求降级处理。常见限流规则如按QPS
限流、按最大并行使用线程数限流。
限流还可限制单位时间内发往一个服务集群的请求总数不能超过多少,即对一个服务集群限流,不过集群限流方式实现上比单机难度稍大,需要统计单位时间内集群处理的请求数据信息。通常集群限流用于网关层,由网关限制请求某个服务集群的请求数。