分布式架构知识整理-服务降级设计与实践
本文将从以下三个方面阐述服务降级设计与实践
为什么要做服务降级
怎么做服务降级
深度思考
1
为什么要做服务降级
场景介绍
解决方案
扩容服务,微服务架构下,如果服务是无状态化的,可以无限的扩容单个服务。
服务降级,每个服务都拒绝自己处理不了的请求,或者延迟处理。成本高。
服务降级
定义
案例
目的
降级方案
关闭部分业务服务
拒绝部分请求
降级目标
保证核心服务可以,非核心服务若可用,甚至不可用
服务降级策略是柔性的
拒绝策略
随机拒绝
随机拒绝超过阈值的请求 。
拒绝旧请求
按照请求的时间,优先拒绝更早收到的请求。
拒绝非核心请求
根据系统业务设置核心请求清单,将非核心清单内的请求拒绝掉。
降级过程
一、架构设计
先简单介绍下架构设计方案。
服务基于Reactor模型实现,主要由以下三部分组成
IO线程、请求队列、工作线程。
请求头RequestHead包括uid、token等
二、降级开启
主要设计:
在请求头增加startTime
入队时设置startTime为入队时间
出队时,使用出队时间-入队时间(etcTime-startTime)
若(et-st)>1s,设置降级开关为打开,并将counter置为0
三、拒绝请求
主要设计:
系统维护cmd核心请求清单,启动读取到内存。清单可以存放在本地文件或者配置中心
在请求头增加cmd
检查降级开关是否开启
若开关打开,则执行请求拒绝
1)拒绝老请求,若(et-st)>1s,则直接拒绝请求
2)拒绝非核心请求,若请求cmd不在核心请求清单,则直接拒绝
四、降级关闭
主要设计:
系统维护一个counter,记录在降级开关打开的时候,et-st<1s的数量
在降级打开时,拒绝请求前先计算(etcTime-startTime),若(et-st)<1s,则counter++
若counter>=10(可配),则将降级开关关闭,恢复正常流量
微服务架构下在哪一层实现降级
降级方式:
集中式,只在网关层,若在网关层做降级,存在如下两个问题
1)需要关注其他层的处理能力
2)实际过程,很难得到其他层的处理能力
自治式,由网关层、业务逻辑层、数据访问层分别自己做降级
假设请求量过大,通过cmd的过滤后,仍有过多的请求怎么处理
方案一、请求延迟处理
上游服务降级开启时,将核心业务的写请求发送到MQ
下游服务从MQ读取消息来消费
方案二、cmd清单的动态更新
待更新...