Skip to content

Sentinel原理

Sentinel工作主流程

滑动窗口实现原理 · 吾爱开源 · 看云

限流算法

计数器算法

计数器算法统计某个时间段的请求量,判断是否超过阈值。

存在的问题:

如上图中,在时间段的临界处加起来其实QPS 超过了阈值,但是平均到单个时间段未发生。

单纯的计数器算法存在 临界统计不准确 的问题。

滑动窗口计数器算法

解决滑动窗口存在的问题,引入了滑动窗口计数器。

我们将统计时间细分,比如将 1s 统计时长分为 5个 时间窗口,通过 滚动统计所有时间窗口的QPS 作为系统实际的 QPS 的方式,就能解决上述 临界统计 问题。

漏斗算法

类似一个队列,每隔10ms从队列头部取出流量进行放行,而我们的队列也就是漏桶,当流量大于队列的长度的时候,我们就可以拒绝超出的部分。

存在的问题:

由于漏斗要求请求比较均匀,不适合突发流量。

适合消费 MQ 这种请求均匀的情况,达到控制请求速率的场景。

令牌桶算法

令牌桶存放一定数量的令牌,请求过来获取到令牌才会放行。

可以应对突发流量的情况。

滑动窗口算法的实现-LeapArray

滑动窗口将一段时间间隔(intervalInMs)划分成了由 N个(sampleCount)桶(Bucket)组成的时间片数组,每个桶的时间长度是 windowLengthInMs,桶里面保存了统计的相关数据。

对所有有效桶内的 QP(请求量)求和就能得出单位有效时间内的 QPS。

  • 情况一:缺少桶,需要创建新桶并更新到数组。

    判断当前时间段的桶是否存在,如果不存在,则创建一个新的桶,并尝试使用 CAS 操作将其更新到滑动窗口的桶数组中,如果更新成功,则返回新的桶。

  • 情况二:最新桶,直接返回。

    如果桶已经存在,并且与当前时间段的起始时间相同,则说明这个桶是最新的,可以直接返回。

  • 情况三:桶被丢弃,需要重置

    如果桶已经存在,但其起始时间已经过期,则需要更新这个桶。

关键类

  • StatisticNode
  • StatisticSlot
  • ArrayMetric
  • LeapArray

当 Sentinel 监控系统对某个资源进行监控时,会创建一个对应的 StatisticNode 节点。

该节点通过 StatisticSlot 统计槽收集和处理数据。

并通过 ArrayMetric 数组度量器来维护收集的数据。

LeapArray 则相当于一个滑动时间窗口,用于按照时间周期将各个 ArrayMetric 链接起来,以形成一个时间线的统计图。

同类组件功能对比

SentinelHystrixresilience4j
隔离策略信号量隔离(并发控制)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于慢调用比例、异常比例、异常数基于异常比例基于异常比例、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
动态规则配置支持近十种动态数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
单机限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
集群流控支持不支持不支持
流量整形支持预热模式与匀速排队控制效果不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
热点识别/防护支持不支持不支持
多语言支持Java/Go/C++JavaJava
Service Mesh 支持支持 Envoy/Istio不支持不支持
控制台提供开箱即用的控制台,可配置规则、实时监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统

  • 线程池隔离:
    1. 调用线程和 hystrixCommand 线程不是同一个线程,并发请求数受到线程池(不是容器 tomcat 的线程池,而是 hystrixCommand 所属于线程组的线程池)中的线程数限制,默认是10。
    2. 这个是默认的隔离机制。
    3. hystrixCommand 线程无法获取到调用线程中的 ThreadLocal 中的值。
  • 信号量隔离:
    1. 调用线程和 hystrixCommand 线程是同一个线程,默认最大并发请求数是10。
    2. 调用数度快,开销小,由于和调用线程是处于同一个线程,所以必须确保调用的微服务可用性足够高并且返回快才用。

注意:如果发生找不到上下文的运行时异常,可考虑将隔离策略设置为 SEMAPHONE。

参考链接

【RuoYi-Cloud-Plus】学习笔记 06 - Sentinel(一)关于 StatisticSlot 以及 LeapArray_sentinel leaparray-CSDN博客

Sentinel 1.8.4 规则持久化源码分析| ProcessOn免费在线作图,在线流程图,在线思维导图

思考

告警压缩功能可以用滑动窗口去做吗

  • 告警压缩也是用滑动窗口实现。
    • 比如一分钟内同机器CPU超过80告警。针对机器生成一个时间桶,写入数据时判断桶内数据是否达到阈值。