Sentinel限流熔断

服务限流的作用及实现
限流的主要目的是通过限制并发数访问或者限制同一个时间窗口允许处理的请求数量来保护系统。提供稳定可靠的服务。
计数器算法
在指定周期内累加访问次数,当访问次数达到设定的阈值,触发限流策略,当进行下一个周期时访问次数
清0
滑动窗口算法
在固定窗口中分割出多个小时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除 过期的小时间窗口。最终只需要统计滑动窗口范围内的所有小时间窗口总的技术即可。
令牌桶限流算法
【Sentinel限流熔断】令牌桶是网络流量整形和速率限制中最常使用的一种算法,对于每一个请求都要从桶里获取一个令牌,如果没有获得令牌,则需要触发限流策略
漏桶限流算法
漏桶限流算法的主要作用是控制数据注入网络的速度,平滑网络上的突发流量。漏桶算法取决于消费者的处理能力。
服务熔断 与降级
服务熔断用来解决当微服务某个链路上被依赖的服务不可用,出现的雪崩。服务熔断是指当某个服务无法正常为服务调用者提供服务时,比如请求超时、服务异常等,为了防止整个系统雪崩,暂时将故障的窗口隔离开来,短接与外部接口的联系。
服务降级有几个方案:
平均响应时间: 比如1s内进入了5个请求,对应时刻的平均响应时间超过阈值,那么接下来再一个固定的时间窗口内,对这个方法的访问都会自动熔断。
异常比例:当某个方法每秒调用所获得的异常总数比例超过设置的阈值,该资源会自动进行阈值,也就是在一个固定时间窗口中,对这个方法的调用都会自动返回
异常数量: 和异常比例类似,当某个方法在指定时间窗口内获得的异常数量超过阈值时灰出发熔断
分布式限流框架Sentinel
Sentinel是面向分布式的轻量级流量控制组件,主要以流量切入点为主,从限流、流量整形、服务降级、系统负载等多个维度来保护系统的稳定性。
Sentinel的特性
  • 丰富的应用场景:几乎覆盖所有的应用场景、秒杀、消息消峰填谷
  • 实时监控:Sentinel提供了实时监控功能。开发者可以在控制台看到接入应用的单台机器的秒级数据
  • 开原生态支持:开箱即用的与其他框架进行整合,如SpringCloud、Dubbo、gRpc的整合
  • SPI扩展点支持: Sentinel提供了SPI扩展点支持,开发者可以通过扩展点来定制化限流策略,动态数据源适配等需求
Sentinel 的组成分为2个部分
  • 核心库Java客户端:不依赖任何框架/库;能够运行所有Java运行时环境,同时对dubbo、SpringCloud等框架也有较好的支持
  • 控制台:基于SpringBoot开发,打包后直接运行,不用额外的tomcat等应用容器
Sentinel限流步骤分为如下流程:
  • 定义资源
  • 定义限流规则
  • 校验规则是否生效
Sentinel资源保护规则
Sentinel支持多种保护规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则、热点参数规则等
基于并发数和QPS的流量控制
Sentinel流量控制统计有两种类型,通过grade属性来设置
  • 并发线程数
  • QPS
    • 并发线程数:并发线程数限流用来保护业务县城不被耗尽,Sentinel并发线程数限流是统计当前上下文线程数量,如果超出阈值,新的请求机会被拒绝
    • QPS: 表示每秒的查询数,也就是一台服务器每秒能够响应的查询次数,当QPS达到限流的阈值时,就会触发限流规则。
  • QPS流量控制行为:
    • 直接拒绝
    • WARM UP
    • 匀速排队
    • 冷启动+匀速排队
调用关系流量策略
  • 根据调用方限流
  • 根据调用链路入口限流
  • 具有关系的资源流量控制
    • 调用方限流:所谓调用方限流,就是根据请求来源进行流量控制,可以设置如下3个值
      • default不区分调用者,任何调用者都会进行限流统计
      • {some_origin_name}:设置特定的调用者,只有来自这个调用者的请求才会进行流量统计和控制
      • other:表示针对除{some_origin_name}外的其他调用者进行流量统计
    • 根据调用链路入口限流
      • 对调用方法的入口进行限制、针对指定的调用入口才进行限流统计
    • 关联流量统计
      • 当两个资源存在依赖关系或者资源争抢时候,我们就说这两个资源存在关联,两个互相依赖的资源 其中一个可能影响另外一个的执行效率,所以针对此进行管控。
Sentinel实现服务熔断
Sentinel提供三种熔断策略
  • 平均响应时间:如果1s内持续进入五个请求,对于平均响应时间超过了阈值,那么在接下来,对这个方法调用都会自动熔断
  • 异常比例: 如果每秒自由桉树>=设定的阈值,则资源进入降级状态
  • 异常数: 当资源最近一分钟的异常数量超过 数据超过阈值之后,会触发熔断。如果timewindows小于60s,则结束熔断之后仍然可能再次进入熔断。
Sentinel热点限流
  • 针对频繁使用的参数进行限流、如IP等可以认为是个热点参数
Sentinel的工作原理
Sentinel的核心分为三部分:工作流程、数据结构和限流算法调用链路是Sentinel的工作主流程,由各个Slot插槽组成,将不同的slot按照顺序穿在一起,从而将不同的功能、限流、降级、系统保护等组合在一起。每个Slot都有对应的职责。

  • NodeSelectorSlot:负责收集资源的调用路径,以树状结构存储调用栈,用于根据调用路径来进行限流降级
  • ClusterBuilderSlot:负责创建以资源名维度统计的clusterNode,以及创建每个ClusterNode下按调用来源origin划分的StaticNode。
  • LogSlot:在出现限流、熔断、系统保护时负责日志记录
  • AuthoritySlot: 权限控制,支持黑名单和白名单两种策略
  • FlowSlot: 根据限流规则和各个Node中的统计数据进行限流判断
  • DegradeSlot: 根据熔断规则和各个Node中的统计数据进行服务降级
  • StatisticSlot: 统计不同维度的请求数、通过数、限流数、线程数等runtime信息这些数据存储在DefaultNode、OriginNode和ClusterNode中
Sentinel限流主要逻辑:
校验全局上下文Context通过lookProcessChain方法获取的一个ProcessorSlot链执行chain.entry如果没有被限流、则返回entry对象

    推荐阅读