Sentinel源码一:Sentinel概览

Sentinel是一个用于保护分布式系统的工具,通过流量控制、服务熔断等功能,确保系统稳定。它在阿里巴巴的双十一等场景中有广泛应用,提供丰富的扩展支持,包括与SpringCloud等框架的集成。Sentinel的核心功能包括流量控制、熔断降级,以及系统自适应保护机制。
摘要由CSDN通过智能技术生成

什么是Sentinel

Sentinel是分布式系统的防御系统。以流量为切入点,通过动态设置的流量控制、服务熔断等手段达到保护系统的目的,通过服务降级增强服务被拒后用户的体验

从官方文档的介绍,Sentinel具有以下特征:

  • 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量和核心场景,例如秒杀(即突发流量控制在系统容量在可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等
  • 完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台看到接入应用的单台机器秒级数据
  • 广泛的开源生态:Sentinel提供开箱即用的于其他开源框架/库的整合模块,例如与Spring Cloud、Dubbo、GRPC的整合。只需要引入相关的依赖并进行简单的配置即可以快速的接入Sentinel
  • 完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展点。你可以通过实现这些拓展点,快速的定制逻辑。例如定制规则管理、适配数据源等

Sentinel主要功能

流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然后,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel作为一个适配器,可以根据需要 把随机的请求调整成合适的形状,如图:
image.png
流量控制有以下几个角度:

  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系
  • 运行指标,比如 QPS、线程池、系统负载等
  • 控制的效果,例如直接限流、冷启动、排队等

熔断降级

什么是熔断降级

除了流量控制以外,及时对调用链路中的不稳定因素进行熔断也是Sentinel的使命之后。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会发生请求发生堆积,进行导致级联错误
image.png
Sentinel和Hystrix的原则是一致的:当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联故障

熔断降级设计理念

在限制的手段上,Sentinel和Hystrix采用了完全不一样的方法

Hystrix通过线程池隔离的方式,来对依赖(在Sentinel的概念中对应 资源)进行隔离。这样做的好处是资源和资源做到了最彻底的隔离,缺点是除了增加线程切换的成本(过多的线程池导致线程池数目过多),还需要预先给各个资源做线程池大小的分配

Sentinel对这个问题采取了两种手段:

  1. 通过并发线程数进行限制

和资源池隔离的方法不同,Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程池在特定资源上堆积到一定数量后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始接受请求

  1. 通过响应时间对资源进行降级

除了对并发线程数进行控制以外,Sentinel还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现影响时间过长之后,所有对该资源的访问都会被直接拒绝,直接过了规定的时间窗口才会重新恢复

系统自适应保护

Sentinel 同时提供系统纬度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应该这台机器承载的流量转发到其他机器上去。如果这个时候其他机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,嘴周导致整个集群不可用。

针对这个情况,Sentinel提供了对应的保护机制,让系统的入口流量和系统的负载均衡达到一个平衡,保护系统在能力范围之内处理最多的请求。

Sentinel基本概念

  • Resource:资源resource可以是代码块、方法(普通方法、接口)等,把它们定义为资源后,再定义限流规则后,就可以结合sentinel使用了
  • 规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则、系统保护规则。所有规则可以动态实时调整
  • Slot插槽:Sentinel定义了7种slot插槽,Sentinel正是通过各个插槽间的固定调用顺序来实现限流的,因为后面的插槽可能依赖于前面插槽的计算结果。Sentinel槽链中各Slot的执行顺序虽然是固定好的,但并不是绝对不能改变的。Sentinel将ProcessorSlot作为SPI接口进行拓展,使得SlotChain具备了拓展能力。用户可以自定义Slot并编排Slot间的顺序
  • Entry:是否通过限流的凭证
  • Node节点:DefaultNode= 链路节点,可统计调用链路上某个资源的数据;ClusterNode=蔟节点,可统计某个资源的全局数据;StaticNode=基础节点,其数据结构有秒级/分钟级别的滑动窗口结构;EntranceNode=入口节点,包含一些入口数据
  • Context:Context是对资源操作的上下文,每个资源操作必须属于一个Context。如果代码中没有指定Context,则会创建一个name=sentinel_default_context的默认Context。一个Context生命周期可以包含多个资源操作。Context生命周期的最后一个资源在exit()时会清理该Context,这也就意味这这个Context生命周期结束了

Sentinel架构设计

image.png
Sentinel的工作链(Slot Chain)分为两个部分:

  1. 统计数据结构部分
    • NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级
    • ClusterBuilderSlot:用于存储资源的统计信息以及调用者信息,例如该资源的qps、线程数等等,这些信息将作为多角度限流、降级的依据
    • StatisticSlog:通过滑动窗口算法则用于记录、统计不同角度的运行时指标监控信息
  2. 判断部分
    • ParamFlowSlow:热点数据流控
    • SystemSlot:通过判断系统相关指标来进行限流:
    • AuthoritySlot:根据配置的黑白名单和调用来源信息,来做黑白名单控制,对应授权规则
    • FlowSlot:用于根据预设的限流规则以及前面Slot统计的状态,来进行流量控制,对应流控规则
    • DegrateSlot:通过统计信息以及预设的规则,来做熔断降级
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值