分布式流控
一、功能描述
控制单jvm内接口每秒钟的有效请求数
二、特点
1、粒度控制到接口
2、阈值为单jvm阈值
三、适用场景
1.保护单jvm服务请求
2.适用于交易链路商品维度的
3.适用于浏览线
4.压力在应用
四、使用举例
适用于自身能力的防护,无整体tps限制要求,可根据单机器请求量来控制
五、实现方式
同样也是通过切面的方式切入到需要做流控的接口方法前,流控的处理流程逻辑如下所示:
1、先获取接口当前时间秒的本地配额对象Map<timeSecondKey, 配额对象>
2、如果当前时间秒的配额对象存在
2.1、判断当前秒的流控状态是否为已流控,如果是已流控直接返回接口流控,并记录被流控的请求数量。
2.2、如果未流控,先获取本地配额锁,判断配额是否充足,配额充足则本地配额-1,返回未被流控继续执行接口主体方法。如果配额不足设置接口状态为被流控,并返回流控,流控请求数+1
3、如果当前时间秒配额对象不存在
获取配额锁,创建配额对象,配额值-1,返回未流控;创建对象前将接口配额对象map中timeSecondKey为60s前的记录删除。
六、分布式流控和全局流控对比
分布是流控是到单JVM维度,不需要依赖redis,实现比起全局流控来说更加简单。