限流组件技术选型:
一图胜千言

image.png

sentinel原理:
image.png

sentinel以信号量作为主要的限流依据,一般我们使用注解@SentinelResource注册资源,然后在控制台配置流控规则(后台会加载这些规则)。

以流量控制为例子
注册了资源以后,sentinel会在StatisticSlot去统计并发线程数和QPS。

image.png

image.png

具体怎么实现统计并发线程或者QPS?
LeapArray
Leap array use sliding window algorithm to count data.
滑动时间窗口
image.png

image.png

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: 则是一秒内业务本身异常的总和。

image.png

image.png

image.png

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看是否满足流控规则,满足则截流
image.png

image.png
参考:
https://www.jianshu.com/p/fd736bf709d3
https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6