概念
降级
先说说什么是降级,熔断和限流都要配合降级,降级通俗来讲就是Plan B,即当Plan A执行失败的时候,需要如何处理.可以直接返回失败,也可以转而调用另一个服务.
熔断
系统调用某个服务失败或者某种状态达到阈值的时候,自发的一种保护行为,通过限制调用端调用来实现.例如某个服务需要调用算法服务,算法服务总是返回错误时候,就需要限制对算法端的调用,以保护其他资源不被浪费
限流
限流是指在调用某个服务的时候,出于对系统的保护,按照某个业务维度的值统计达到阈值之后,进行的降级操作.
实现思想
- 不管是Spring 微服务生态的解决方案还是K8s的(Istio)方案,核心本质是代理.
- 熔断和限流都需要有个平面来统计,就限制了不能有client本身触发,因此采用代理来实现
熔断实现
Hystirx框架下,本质上使用代理将客户端封装,封装后,在封装的位置实现统计与降级
Hystirx隔离策略
线程池:默认使用线程隔离策略,直接在线程池中获取新的线程来执行RPC.
缺点:增加计算开销,每个rpc都会被独立的线程执行.
适用于依赖网络访问的请求,只依赖内存缓存的情况下(线程级缓存)信号量:在调用线程中执行,通过信号量进行隔离.适用于只依赖内存缓存且不涉及网络访问.
熔断器参数
- requestVolumeThreshold滑动窗口大小,默认20
- errorThresholdPercentage错误率, 默认50%
- sleepWindowInMilliseconds熔断生效时间,默认5000:5s
限流实现
1、HyStrix中
- 线程隔离时,线程数+排队队列大小
- 信号量隔离时,最大并发数限流
2、并发数量
- QPS、并发连接数
3、总量
- 业务层中,限制某个资源量的总量
限流算法:
1、限制速率: 漏桶算法
2、限制总数: **令牌桶算法 ** 限制某个业务资源的count值,允许短时间突发
异步RPC
通过提升接口性能来提升系统并发处理能力
前提: 异步RPC之间不存在相互依赖
实例:
- 比如你的接口,内部调用了3个服务,时间分别为T1, T2, T3。
- 如果是顺序调用,则总时间是T1 + T2 + T3;
- 如果并发调用,总时间是Max(T1,T2,T3)。
一般成熟的RPC框架,本身都提高了异步化接口,Future或者Callback形式