限流组件技术选型:
一图胜千言
sentinel原理:
sentinel以信号量作为主要的限流依据,一般我们使用注解@SentinelResource注册资源,然后在控制台配置流控规则(后台会加载这些规则)。
以流量控制为例子
注册了资源以后,sentinel会在StatisticSlot去统计并发线程数和QPS。
具体怎么实现统计并发线程或者QPS?
LeapArray
Leap array use sliding window algorithm to count data.
滑动时间窗口
ArrayMetric持有LeapArray,统计节点就能统计以下格式的数据
idx id thread pass blocked success total Rt 1m-pass 1m-block 1m-all exception
2 abc647 0 46 0 46 46 1 2763 0 2763 0
thread: 代表当前处理该资源的并发数;
pass: 代表一秒内到来到的请求;
blocked: 代表一秒内被流量控制的请求数量;
success: 代表一秒内成功处理完的请求;
total: 代表到一秒内到来的请求以及被阻止的请求总和;
RT: 代表一秒内该资源的平均响应时间;
1m-pass: 则是一分钟内到来的请求;
1m-block: 则是一分钟内被阻止的请求;
1m-all: 则是一分钟内到来的请求和被阻止的请求的总和;
exception: 则是一秒内业务本身异常的总和。
public enum MetricEvent {
/**
* Normal pass.
*/
PASS,
/**
* Normal block.
*/
BLOCK,
EXCEPTION,
SUCCESS,
RT,
/**
* Passed in future quota (pre-occupied, since 1.5.0).
*/
OCCUPIED_PASS
}
统计到StatisticSlot数据后调用各种slog看是否满足流控规则,满足则截流
参考:
https://www.jianshu.com/p/fd736bf709d3
https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6