Sentinel

Sentinel是阿里巴巴开源的一个用于保护微服务架构的流量控制组件, 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您提升微服务架构的稳定性。

Sentinel的设计目标是简单易用,可以无缝集成到Spring CloudDubbo等微服务框架中,同时也支持独立使用。 它适用于各种微服务架构,无论是单体应用还是复杂的分布式系统,都能提供有效的流量管理和保护策略。

代码仓库:https://github.com/alibaba/Sentinel 文档地址:https://sentinelguard.io/zh-cn/docs/introduction.html

Sentinel代码模块

  • sentinel-adapter:适配器模块,主要实现了对一些常见框架的适配
  • sentinel-benchmark:基准测试模块,对核心代码的精确性提供基准测试
  • sentinel-cluster:集群流控制模块,默认实现。
    • sentinel-cluster-common-default:用于集群传输和功能的通用模块
    • sentinel-cluster-client-default:使用Netty作为底层传输库的默认集群客户端模块
    • sentinel-cluster-server-default:默认集群服务器模块
  • sentinel-core:核心模块,限流、降级、系统保护等都在这里实现
  • sentinel-dashboard:控制台模块,可以对连接上的sentinel客户端实现可视化的管理
  • sentinel-demo:示例模块,可参考怎么使用sentinel进行限流、降级等
  • sentinel-extension:扩展模块,主要对DataSource进行了部分扩展实现
  • sentinel-logging:日志模块,提供了日志输出的接口,以及一些默认实现
  • sentinel-transport:传输模块,提供了基本的监控服务端和客户端的API接口,以及一些基于不同库的实现

Sentinel提供了以下核心功能

  • 流量控制: Sentinel可以基于资源、URL或者自定义规则进行限流,支持QPS和线程数两种限流方式,以及冷启动和预热机制。
  • 熔断降级: 当下游服务出现异常或者响应时间过长时,Sentinel可以进行熔断,快速返回错误信息,避免雪崩效应。
  • 系统保护: Sentinel可以根据系统的负载情况,比如线程池使用率、CPU使用率、入口QPS等指标,对整个系统进行保护,避免系统过载。
  • 集群限流: Sentinel支持跨应用的集群限流,可以确保整个集群的稳定运行。
  • 动态规则管理: Sentinel支持动态调整规则,无需重启应用即可生效,方便运维和管理。
  • Dashboard: Sentinel提供了一个可视化的控制台,可以实时监控服务的运行状态和流量情况,并且可以动态调整规则。

Sentinel的一些特性

流量控制

Sentinel提供丰富的流量控制策略,例如QPS(每秒查询率)限制、并发线程数限制。 支持基于请求来源的限流,可以对不同来源的请求分别进行流量控制。 支持预热模式,防止因系统启动时流量冲击导致的系统崩溃。

熔断降级

Sentinel支持异常数、异常比例和慢调用比例等多种降级策略。 提供触发熔断的条件配置,自动切断异常服务的请求,保护系统不发生雪崩效应。

热点参数限流

对频繁访问的热点数据进行参数级别的限流,更加精细化管理流量。 可以针对API中的特定“热点”参数进行流量控制,能够处理诸如秒杀场景下的热点限流问题。

系统保护

Sentinel可自适应地保护系统,当系统负载达到设定阈值时,会限制入口流量保护系统稳定。 通过监控系统负载情况,如CPU过高则自动进行流量控制。

实时监控和管理

Sentinel提供实时监控控制台,可视化显示监控信息并实时配置规则。 提供实时监控数据查看和机器发现的功能,方便用户进行系统调优管理。

集群流量控制

支持集群模式下的流量控制,能够在集群中统一管理和协调流量。 支持集群内流量分摊和重定向,以及灵活的流量分配策略。

开放扩展性

Sentinel提供扩展点,支持自定义限流器、降级器等。 支持与其它开源框架与类库的集成,如与Spring CloudDubbo等深度集成。

动态规则配置

支持动态修改流控和降级规则,无需重启服务即可热更新规则。

异步请求支持

对异步请求提供等待队列时间设置,使得异步请求也能实现流量控制。

SentinelHystrix不同

SentinelHystrix都是用于管理分布式系统中的服务可靠性和延迟容忍性的工具,它们提供了像熔断器、限流器和服务降级这样的功能。 虽然两者的目标类似,但它们在实现和功能上存在一些差异。

  • 模块化与可扩展性
    • Sentinel:具有更模块化的设计,提供了更丰富的扩展点,易于个性化和扩展定制。
    • Hystrix:作为Netflix OSS套件的一部分,主要集成到Spring Cloud Netflix中,提供较固定的模式。
  • 流量控制能力
    • Sentinel:专注于流量控制,包括限流、熔断、系统过载保护(通过系统负载来保护服务)、以及流量整形(调整流量分配)等。
    • Hystrix:主要是提供熔断器和线程隔离策略,用于隔离和管理故障。
  • 控制台和监控
    • Sentinel:提供一个功能丰富的控制台,用于实时监控和操作规则配置调整。
    • Hystrix:提供了Hystrix DashboardTurbine,用于聚合和展示服务的指标。
  • 性能表现
    • Sentinel:由于其轻量级的设计,对性能影响较小,适用于高并发场景。
    • Hystrix:由于其设计采用线程隔离,在高并发下可能因线程池的限制而对性能产生影响。
  • 社区支持和维护状态
    • Sentinel:由阿里巴巴维护,并作为Spring Cloud Alibaba的一部分继续得到更新和支持。
    • Hystrix:自2018年起,进入维护模式,Netflix不再积极开发新特性。Spring Cloud项目也逐渐替换为其他替代方案,如Resilience4j
  • 易用性与配置
    • Sentinel:配置方式简单直观,容易入门,且规则配置的灵活性较高。
    • Hystrix:虽然与Spring Cloud集成得比较紧密,但学习曲线相对陡峭,配置项相对复杂。
  • 异步编程模型
    • Sentinel:它天然支持响应式和异步编程模型。
    • Hystrix:虽然提供了对异步执行的支持,但更多的是以同步方式执行。
  • 链路追踪与日志
    • Sentinel:针对链路入口和出口的流量,提供比较细粒度的流量追踪和记录。
    • Hystrix:提供了执行事件的日志功能,但相对较粗。

目前国内主流是使用Sentinel的。

Sentinel流量控制

Sentinel实现流量控制的机制涉及以下几个主要方面:

  • 资源定义
    • 确定需要保护的资源。在Sentinel中,资源可以是HTTP接口、Dubbo接口、某个微服务或一段代码。开发者需要明确资源的资源名,通常作为流量控制的标识。
  • 流量控制规则配置
    • 配置对应资源的流量控制规则,规则包括规则类型(例如QPS或线程数)、阈值、流量控制效果(例如直接拒绝、排队等候或预热/冷却)和流量控制行为(根据调用关系、QPS还是线程数等)。
  • 资源访问入口
    • 在代码中定义资源访问入口。Sentinel利用细粒度的统计来接入和监控应用的不同流量类型,你需要使用Sentinel提供的API来定义资源的开始和结束。
      try (Entry entry = SphU.entry("resourceName")) { 
          // 受保护的资源逻辑
      } catch (BlockException e) {
          // 当流量控制规则触发时,处理控制行为
      }
      
  • 流量控制检查
    • 每当资源被访问时,Sentinel会根据配置的规则来检查是否超出阈值。如果检查通过,则允许访问资源;如果失败,则根据配置的流控效果来执行相应操作。
  • 自适应控制
    • Sentinel支持自适应流控策略,可以根据系统的实际负载(比如系统负载、CPU使用率等)来动态调整流量。
  • 实时监控
    • Sentinel提供监控功能,可以在Sentinel Dashboard实时监控资源的运行状态,查看流量、通过量、阻塞量等指标。

流量控制策略

Sentinel的流量控制是非常灵活的,支持多种控制策略(比如直接拒绝调用、排队等待、按照调用链路入口控制等),并且可以与服务之间的调用链路整合,实现服务间的流量协同。

通过合理设置规则和参数,Sentinel配置的流控规则可以应对不同的流量控制场景,并配合其他功能(比如熔断降级、系统自适应保护)实现更加全面的服务保护。

  • 流量阀值限流(Flow Rule Limiting)
    • Sentinel中最常用的限流方式,它通过配置流量的阀值来控制流量。可以设置QPS(每秒查询率)或线程数阈值。
    • 到达阀值时,Sentinel将根据预定义的流控效果(快速失败、预热、排队等待)来处理后续请求。
  • 关联限流
    • 关联限流(也称为关联流量控制)用于控制当关联资源过载时对当前资源执行限流。例如,当下游服务已接近其负载极限时,可以减少对上游服务的请求。
  • 链路限流(Chain-based Throttling)
    • 链路限流允许你只对特定来源的流量执行限流。该策略可用于微服务场景中,只对来自特定微服务的请求进行限流。
  • 热点参数限流
    • 热点参数限流允许根据请求中的热点参数(例如,在系统中的某业务ID)进行精细化控制。它通过排队来限制频繁访问特定资源的请求。
  • 系统自适应保护
    • 根据系统的负载(比如系统负载、CPU使用率、平均RT)对流量进行动态的限流,以此来保护系统不被高流量击垮。
  • 流量控制效果
    • 在限流策略中,Sentinel支持几种不同的流量控制效果,包括快速失败、Warm Up(预热/冷启动)、排队等待/匀速排队等。
      • 快速失败:直接对超出阈值的请求快速失败。
      • Warm Up:渐进地提高通过量,用于应对系统冷启动。
      • 排队等待/匀速排队:使请求以匀速排队的方式处理,减缓突增流量带来的冲击。
  • 实时监控和动态规则更新
    • Sentinel提供实时监控和动态规则更新的能力。控制台,可以实时监控流量情况,并且在运行时动态调整限流规则。
  • API和注解支持
    • 还提供了丰富的API接口和相关注解,方便在代码中定义规则和限流逻辑。

要执行Sentinel的限流策略,需要在控制台或通过API设置相应的规则,这些规则根据运行时的监控数据动态调整。 这样使得微服务可以根据系统当前的状态和策略来保护自己,并确保系统的稳定性和可靠性。

通过Sentinel的限流机制,可以在不影响系统整体稳定性的前提下,处理高流量压力和潜在的过载风险。

Sentinel限流的规则

QPS控制(每秒查询率)

QPS控制,也就是基于每秒请求数量的控制规则,是Sentinel中最常用的限流规则。 这个规则可以限制资源每秒可以通过的请求次数,如果请求次数超过设置的阈值,新的请求将会被拒绝。

FlowRule rule = new FlowRule();
rule.setResource("someResourceName");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(20); // 设置 QPS 阈值
FlowRuleManager.loadRules(Collections.singletonList(rule));

并发线程数控制

并发限流,这个规则通过限制资源并发执行的线程数量,当并发数达到阈值时,新的进入请求将被阻塞直到有空余线程。

FlowRule rule = new FlowRule("someResourceName")
    .setCount(concurrentThreadCountThreshold)
    .setGrade(RuleConstant.FLOW_GRADE_THREAD);
FlowRuleManager.loadRules(Collections.singletonList(rule));

冷启动规则

冷启动规则用于在系统启动阶段逐渐增加流量,避免服务刚启动时因为并发流量过大导致系统负载突增。

基于预测的动态规则

基于预测的动态规则是Sentinel提供的更高级的限流方式,它根据一段时间窗口内的流量数据预测即将到来的流量,并实时调整限流阈值。

授权和黑白名单规则

可以基于发起者的 IP、用户等信息定义限流规则。可以设置黑名单和白名单,分别来拒绝或只允许某些特定的发起者通过。

流量分配、链路限流

通过定义多个入口资源和关联规则从而实现调用链路的限流,即当某个入口资源的QPS达到设定的阈值时,其关联资源的流量也将被限制。

FlowRule rule = new FlowRule("someResourceName")
    .setLimitApp("default")
    .setGrade(RuleConstant.FLOW_GRADE_QPS)
    .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
    .setCount(1);
FlowRuleManager.loadRules(Collections.singletonList(rule));

慢调用比例控制(仅针对熔断)

Sentinel还提供了慢调用比例的控制规则,可以用来作为熔断策略。 当资源调用的响应时间超过预设的阈值且慢调用比例超过预设的比例时,Sentinel可以暂时断开资源的调用,迅速返回错误信息。

DegradeRule rule = new DegradeRule("someResourceName")
.setGrade(RuleConstant.DEGRADE_GRADE_RT)
.setCount(responseTimeThreshold)
.setTimeWindow(inSeconds);

Sentinel可以动态修改这些规则,并支持通过Dashboard实时更新和推送规则。

使用Sentinel设定限流规则时,应该根据业务和性能来判断合适的限流策略。 同时Sentinel支持自定义限流效果,比如按自定义比例进行限流或队列等待等,增加了限流控制的灵活性。

Sentinel熔断策略

Sentinel提供了多种熔断策略,用于在服务不稳定或达到一定的不健康指标时对调用进行熔断降级,从而保护系统避免雪崩效应。

  • 基于响应时间的熔断(慢调用比例)

    • 此策略会检测调用的响应时间。当一段时间内资源的平均响应时间超过阈值(如200ms),且在溢出请求数量超过最少请求数(比如5个)的情况下,如果慢调用比例超过某个阈值(如50%),就会触发熔断。熔断发生后,后续的调用会被自动降级(直接返回或抛出异常),直到过了降级时间窗口,服务才会自动恢复。
  • 异常比例/异常数熔断

    • 基于异常比例的熔断会监控调用异常产生的比例。当一段时间内异常比例超出设定的阈值(例如每秒请求异常率超过50%)时,服务会进入降级,后续的调用会立即返回错误。
    • 基于异常数的熔断类似,但它基于一段时间内连续发生的异常数来进行熔断判断。
  • 基于错误率熔断

    • 该策略通过统计一段时间内调用中出现错误的比率,当错误率达到阈值时触发熔断。
  • 强制降级

    • 与自动熔断策略不同,强制降级是通过手动设置标志位来强制让资源直接进入降级状态,所有访问该资源的请求都会被拒绝直至关闭强制降级。

对于熔断策略的选择和配置,选择合适的熔断策略通常取决于服务的实际业务逻辑和稳定性目标。

例如,对于复杂的计算密集型任务,可能更倾向于选择基于响应时间的熔断策略, 而对于简单的数据查询服务,则可能更关注于异常比例或错误率。

无论选择哪种熔断策略,关键的是要根据实际的度量及错误模式合理配置阈值。 通常需要结合业务数据进行压力测试,以确定最佳的熔断参数。 这些参数包括阈值、统计时间窗口、最小请求数、慢调用的耗时定义、熔断持续的时间窗口等。

配置熔断规则时还要考虑其可能对用户体验和系统功能的影响。 应该确保熔断规则既能对系统做出快速的保护反应,又不会过于敏感以至于误伤正常的流量。

Sentinel提供了一套灵活的规则管理器和控制台,有助于开发者调整和优化这些熔断策略。

Sentinel系统保护规则

Sentinel的系统保护规则是为了防止系统过载而设计的,在资源即将饱和时自动进行保护。 这种规则主要通过监控系统的负载情况(比如CPU使用率、系统平均负载等指标)来动态调整入口流量,从而保证整个系统的稳定性。

Sentinel系统保护规则的工作原理

  • 负载类型

    • 系统保护规则主要关注以下两类指标:
      • Load:系统的平均负载,代表CPU的工作负荷。Sentinel会根据系统平均负载的水平来决定是否进行流量控制。
      • CPU UsageCPU利用率,描述当前进程占用CPU的比例。当这个比例超过某个阈值后,Sentinel可以限制某些资源的流量来避免CPU过载。
  • 流量调整

    • 当检测到负载指标超过预设的阈值时,Sentinel会立刻启动流量控制机制。规则可以配置为根据检测到的负载高低动态调整系统允许通过的流量量级。
  • 保护效果

    • 一旦系统保护规则触发,Sentinel会对入口流量进行限制。这可能导致部分请求被拒绝,并返回Sentinel的流控异常BlockException
  • 自适应阈值

    • Sentinel所设计的系统保护机制能够根据系统运行时的性能指标(如CPULoad)自适应地调整阈值,而不是简单地使用固定阈值。
  • 实时更新和热点保护

    • 系统保护规则能够实时生效,无需重启应用。同时,它能够有效地保护系统中的热点资源。
  • 配置方式

    • 控制台界面供用户配置系统保护规则,也可以通过API动态调整系统保护规则。
  • 多维度控制

    • 允许配置多个维度的保护规则,比如QPS、并发线程数等,为系统提供更全面的保护。

通过以上机制,Sentinel系统保护规则能够自动化地维护系统在高负载下的稳定性,有效地防止系统过载引起的雪崩效应。这些规则是保证微服务在不稳定环境下正常运行的关键配置。

降级规则

降级(Degradation)是指为了保证核心服务的高可用性,在某些异常情况(如系统过载、依赖服务故障等)下,系统可以主动地降低或关闭一些非核心功能或服务质量。 Sentinel提供了降级规则的功能,以实现这种目标,保护系统免受不稳定因素的影响。

Sentinel 降级规则

  • RT(平均响应时间):如果1s内持续进入5个请求,对这5个请求的平均响应时间(平均成功执行时间)超过阈值(默认为490ms)过多次(默认为5次),那么在接下来的时间窗口(默认为秒级)中,对该服务的调用都会自动熔断(默认行为是抛出异常)。

  • Exception Ratio(异常比例):当资源的每秒异常总数占通过量的比值超过阈值值(默认为0.550%)之后,资源进入降级状态,即在接下来的时间窗口(默认为秒级)中,对该资源的调用都会自动熔断。异常比例的统计窗口长度是1分钟

  • Exception Count(异常数):当资源近1分钟的异常数目超过阈值之后会进行熔断。注意异常数是指统计时间窗口内的异常数量(对于异常率是百分比)。时间窗口是分钟级别的,如果在1分钟内异常数超过此值,资源会降级。

实施降级规则适合那些运行时间较长、稳定性比较差或可能会被恶意流量影响的资源。当资源被降级后,在接下来的降级时间窗口内,所有调用此资源的请求都会自动被拒绝,后续请求可以根据业务情况提供降级逻辑或者提示用户服务暂时不可用。

降级规则是一种主动保护机制,有助于在系统出现不稳定行为或即将过载时主动介入,从而避免系统发生连锁反应,导致更严重的故障或服务不可用。

Sentinel的降级规则可以配置在propertiesyml配置文件中,也可以通过Sentinel控制台(Dashboard)动态修改。 使用Sentinel时,应当根据业务和服务特征设置合理的降级规则以达到最佳的效果。

配置降级规则

Sentinel的降级规则主要用于在特定条件下保护系统,当资源的行为符合配置的降级规则时,Sentinel会自动进行降级操作。 这样做可以快速释放系统流量压力,并保持系统的稳定性。

配置降级规则通常涉及几个关键步骤:

  • 定义资源

    • 首先要定义需要降级保护的资源,资源通常是一段代码逻辑,比如一个重要的方法或者Web接口。
  • 配置规则属性

    • Sentinel的降级规则包含以下属性:
      • 资源名:降级规则所针对的资源名称。
      • 降级策略:选择根据RT(平均响应时间)、异常比例或异常数进行降级。
      • 量化指标:根据选择的策略设置对应的量化指标,如异常数、RT、异常比例等。
      • 降级的阈值:触发降级的值,如RT阈值200毫秒,表示当资源的平均响应时间超过此值时,会触发降级。
      • 最小请求数:设置在统计时间窗口内有效的最小请求量,仅当在该统计时间窗口内的请求量不少于此设置值时,才会计算降级条件。
      • 降级的时间窗口:在降级发生后,资源将保持降级状态的时间(),时间窗口结束后,Sentinel会自动恢复资源。
  • 使用Sentinel Dashboard

    • 通过图形化界面Sentinel Dashboard配置降级规则。在Dashboard中选择对应的资源,然后添加降级规则并设置上述的规则属性。
  • 编程式配置

    • 可以在应用代码中使用API直接配置降级规则
      DegradeRule rule = new DegradeRule(resourceName)
          .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
          .setTimeWindow(10)
          .setCount(0.2)
          .setMinRequestAmount(50);
      DegradeRuleManager.loadRules(Collections.singletonList(rule));
      
      上述表示配置资源名(resourceName)的降级规则,当资源的异常比例超过20%(0.2),且在最近10秒内至少有50个请求时,触发降级,在降级的时间窗口内,新的调用将被立即拒绝。
  • 测试与校验

    • 配置好规则后,进行测试以确保降级行为符合预期,并根据测试结果进行必要的调整。
  • 动态规则源

    • Sentinel支持动态规则配置,可以将规则保存在NacosZooKeeperApollo等动态配置中心。变更规则时,Sentinel可以实时从配置中心拉取规则进行更新。

使用降级规则时要注意的是,应根据业务场景和服务的承受能力谨慎配置降级参数,合理配置最小请求数和时间窗口,确保降级策略既能保护系统,又不会对用户体验造成不必要的影响。

同时,降级规则应与告警系统相结合,确保在触发降级时及时通知运维团队进行处理。

Sentinel降级规则的使用场景

Sentinel提供的降级规则是一种稳定性保护措施,用于在系统出现潜在风险时自动降级服务,从而保证系统的整体可用性。 Sentinel降级的主要目的是当服务不可用或响应过慢时,通过预定义的降级策略来防止级联故障的发生。

常见的Sentinel降级规则使用场景:

  • 服务异常比例降级

    • 当服务的异常比例超过一定阈值时,降级规则会被触发。例如,如果在一分钟内服务异常返回的比例超过了设定的百分比,将会对该服务进行降级。
    • 场景:预防由于服务异常导致的资源耗尽,如bug、外部系统不稳定引发的异常。
  • 服务异常数降级

    • 当服务在一定时间内的异常数超过设定的值时,触发降级规则。
    • 场景:适用于服务短时间内因为外部问题(如依赖服务故障)导致大量请求失败的情况。
  • 服务响应时间降级

    • 如果服务的响应时间超过预设的延迟阈值,且超时次数超过一定数量,降级规则会被触发。
    • 场景:对于响应时间敏感的服务,防止因为个别慢请求导致的服务雪崩效应
  • CPU使用率降级

    • 当机器的CPU使用率超过预设的阈值时,触发降级保护。
    • 场景:在CPU资源紧张时,提前防范服务过载的风险。
  • 自定义降级策略

    • Sentinel也支持自定义降级规则,开发者可以根据业务需要编码实现。
    • 场景:满足特定业务需求的情况,如基于特殊指标业务逻辑的降级策略。
  • 降级效果

    • 触发降级规则后,Sentinel支持多种降级效果,包括直接返回默认值、抛出异常、重定向到备用服务、限流等。
    • 场景:根据不同业务场景,选择最合适的降级措施以确保系统的稳定性。

使用Sentinel降级规则的一个关键顾虑是避免产生误伤,即误将正常的波动识别为异常并执行降级。

所有降级规则应当细心地配置和调整,以权衡风险和对业务的影响。 同时,应确保降级逻辑所造成的系统状态和用户体验符合业务的宽容性要求。 在实际应用之前,要进行充分的测试来验证其效果。

Sentinel降级策略

慢调用比例(Slow Request Ratio)

当调用的平均响应时间超过阈值,并且在统计时间窗口内的慢调用比例超过设定的比例时,会触发降级操作。 比如,如果设定的阈值是200毫秒,慢调用比例阈值是50%,在最近1分钟内如果有超过50%的调用响应时间超过了200毫秒,会将这个资源标记为降级状态。

DegradeRule rule = new DegradeRule("someResource")
    .setGrade(RuleConstant.DEGRADE_GRADE_RT)
    .setCount(200)  // 慢调用阈值,单位为毫秒
    .setTimeWindow(1)  // 单位为分钟
    .setMinRequestAmount(5)  // 最小请求数
    .setStatIntervalMs(60000)  // 统计时间窗口,单位为毫秒
    .setSlowRatioThreshold(0.5);  // 慢调用比例阈值

主要用于控制那些自身性能问题引发的稳定性问题。

异常比例(Exception Ratio)

当资源的异常比例超过阈值时,会触发降级操作。异常比例是指在统计时间窗口内异常数量与总调用次数的比值。

DegradeRule rule = new DegradeRule("someResource")
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
.setCount(0.5)  // 异常比例阈值
.setTimeWindow(1);  // 单位为分钟

主要用于根据异常比例来决定是否降级。适用于明显的错误增多需要立即保护系统稳定性的场景。

异常数(Exception Count)

当资源在统计时间窗口内的异常数目超过设定的阈值时,会触发降级操作。

DegradeRule rule = new DegradeRule("someResource")
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT)
.setCount(5)  // 异常数量阈值
.setTimeWindow(1);  // 单位为分钟

主要用于那些单个异常数较多的场景,比如服务器瞬间的高负载造成大量超时。

降级规则定义了触发降级后的熔断时长,即降级状态持续的时间。 熔断时长结束后,资源会自动恢复。通过setTimeWindow方法设置。

还应该注意:

  • 适合的策略:根据业务和场景,选择适合的降级策略。
  • 统计时长设置:合理设置统计时长,以确保降级行为尽可能准确地反映系统的实际状态。
  • 结合告警系统:当降级发生时,结合告警系统及时通知相关人员。
  • 权衡和测试:降级机制的设置可能会影响用户体验,因此在生产中启用前应充分测试。

Sentinel的降级策略是微服务系统稳定性保障的重要手段。 通过这些策略的正确使用和配置,可以大大减少系统由于局部问题而全局受影响的风险。

热点参数限流

Sentinel的热点参数限流是指针对热点参数(即经常变更或访问频繁的参数),动态地实施流量控制的功能。 在微服务或分布式系统中,某些特定的参数可能会在短时间内接收到大量的请求,这可能会导致系统过载或变得不稳定。

这些热点参数通常是指那些高频访问的关键业务参数,比如用户ID、身份ID等。

热点参数限流关注于对方法调用的参数进行检查并进行限流,而不仅仅是简单地针对某个服务或URLSentinel允许对这些热点参数进行细粒度的流控策略配置,如设计规则来限制某个参数值在单位时间内的调用次数。 这有助于保护系统不会因为少数高频访问的操作而导致整体性能下降。

主要特点

  • 参数动态识别:Sentinel能够识别方法调用中的参数,动态地根据参数值管理流量。
  • 多维度限流:支持通过参数索引、单一参数值或多参数值来定义流量控制规则。
  • 规则自定义:用户可以基于业务需求自定义限流的规则和阈值。
  • 集群模式支持:在集群模式下,热点参数限流规则可以快速在集群中传播,确保整个系统的一致性。
  • 异常处理:发生限流时,可自定义异常处理逻辑,例如返回默认值、抛出特定异常,或者进行服务降级。

使用热点参数限流

可以通过控制台配置热点参数限流规则,或通过API编写代码处理。

@Resource
private DegradeRuleManager degradeRuleManager;

public void initRules() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource("hotParamResource");
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);// 平均响应时间
    rule.setTimeWindow(10);// 熔断时长,单位为 s
    rule.setCount(100);// 单机阈值
    rule.setLimitApp("default");// 针对来源
    rule.setParamIdx(0);// 参数索引
    rule.setParamFlowItemList(Collections.singletonList(new ParamFlowItem("specific-value", 200)));// 特定热点参数值
    rules.add(rule);
    degradeRuleManager.loadRules(rules);
}

代码中,设置了对名为hotParamResource资源中索引为0的参数进行限流, 仅当该参数的值为specific-value时,其单机阈值为每秒200个请求。

使用热点参数限流时需要注意:

  • 需要合理设置参数限流的阈值和统计时间窗口,以避免误伤正常请求或因误判导致不必要的服务降级。
  • 热点参数限流针对的是高度动态且敏感的业务环境,因此需要更频繁地进行监控和调整。
  • 热点限流配置应当与整体的流量控制策略和服务降级机制相结合。

简单来说,Sentinel的热点参数限流是对传统流控策略的一种重要补充,它有助于实现更加精细化的流量控制,保护系统免受异常流量的影响。

配置热点规则

热点规则(HotSpot Rule)是一种针对特定参数的流量控制规则,它用于处理对于频繁访问的热点参数进行限流,尤其可以用于处理高并发且参数不均匀的场景。 配置热点规则通常包括设定阈值、指定参数索引、设置限流行为等。

配置热点规则的一些基本步骤:

  • 通过控制台配置:

    • 打开控制台,访问提供的Web控制台,默认URL通常为 http://localhost:8858/。
    • 在控制台的左侧菜单中,选择你的应用,然后在页面中选择热点规则选项。
    • 点击添加规则按钮,在表单中填写规则对应的资源名、参数索引、限流模式(阈值类型)、单机阈值数量等。
    • 为方法调用指定参数索引(参数位置),例如,参数索引0代表方法的第一个参数。
    • 异常数回退(可选),可以根据异常数来决定是否对参数进行降级。
    • 设置阈值模式,如QPS或线程数,以及对应的限流阈值。
    • 填写完毕后,点击保存按钮来启用你的热点规则。
  • 通过编程方式配置:

    • 如果使用的是微服务框架,代码中通过编程的方式配置热点规则:

      public class MyConfiguration {
          public void initHotSpotRule() {
              ParamFlowRule rule = new ParamFlowRule("myResource")
                      .setParamIdx(0) // 参数的索引位置
                      .setGrade(RuleConstant.FLOW_GRADE_QPS) // 限流的阈值类型
                      .setCount(5); // 限流 QPS 数量
      
              // 加入规则
              ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
          }
      }
      

      代码中,myResource是方法或者资源的名称,需要根据实际情况填写。

热点参数限流是一种涉及参数的高级限流功能。 当配置热点规则时,需要谨慎分析目标系统的使用模式以及哪些参数需要被定义为热点。

通常,配置热点参数时,系统将根据规则中指定的参数值进行区分,对每个热点参数的不同值应用独立的限流阈值。 这意味着如果方法有一个用户ID参数并频繁被特定用户访问,可以对该用户ID设置特定的频率阈值。

热点规则配置完成后,Sentinel会开始对运行时的调用进行监控,确保不会超过配置的流量阈值。 这能够有效地防止系统被高频调用的热点参数请求所拖垮,从而维持系统的稳定性。

Sentinel热点参数限流

热点参数限流是一种高级的限流方式,它可以针对方法的参数,进行细粒度的流量控制。 这种机制特别适用于那些某些特定参数值对应请求频繁的场景,如常见的热点数据,通过对这些热点进行限制可以保护系统负载达到最优。

热点参数限流的工作原理主要包括:

  • 参数识别

    • 在定义资源规则时,你需要指定限流规则对应的参数索引,告诉Sentinel需要对哪个参数进行热点限流。Sentinel会跟踪这些参数的具体值。
  • 限流规则:

    • 针对特定的参数值,可以设定不同的限流阈值。例如,对于一个频繁获取的用户ID,可以设置一个较低的限流阈值,当该用户ID请求频次超过这个值时即进行限流。
  • 异常比例:

    • 当方法的调用结果为异常时(通过异常比例来定义,默认情况下HTTP 500错误会被统计为异常),如果异常数量占比超过配置的阈值,则对该热点参数对应的值进行限流。
  • 参数排队等待

    • 类似于漏桶算法,Sentinel允许为热点参数的每一个值设置一个等待队列,即当达到限流值时,后续请求可以选择等待。
  • 冷加载因子

    • Sentinel支持冷加载因子的设置,在热点参数值首次进入系统时,由于预热时间,流量会逐渐地从0增加到阈值,而非立即到达阈值,避免冷数据突然变热导致的系统冲击。
  • 动态规则

    • Sentinel提供界面和API支持对热点参数限流规则动态配置;运维人员可以根据实时监控数据调整相关策略。
  • 客户端支持

    • Sentinel提供了客户端库,通过接入Sentinel客户端,开发者可以轻松设置方法上的热点参数限流规则。

热点参数限流是一种非常有效的限流手段,尤其是在面对不平等请求负载情况下,它能够保护系统免受短时间内大量热点流量的影响,提供更为平稳和可控的服务。

在实践中,合理配置热点参数限流规则对于保障系统稳定性和提高系统可用性至关重要。

热点限流的参数异常项

Sentinel中使用热点限流功能时,热点参数是指在高并发场景下经常访问的,变化较为频繁的参数,例如用户ID等。 对这些热点参数进行限流可以有效地保护应用不被流量洪峰所淹没。 而热点限流中的参数异常项(Parameter Exception Item)则是一种特殊的规则配置,允许针对特定的参数值定义特殊的限流规则。

通常情况下,Sentinel热点限流可以为方法定义一个全局的QPS(每秒查询率)阈值。

在某些情况下,你可能希望对某些特定的参数值或参数异常值设置不同的阈值。

例如:

  • 某个特定用户ID的请求比其他用户的请求更频繁,需要专门对该用户ID进行限流
  • 某些特定商品在促销期间访问量激增,需要对这些商品ID实施特殊的限流规则
  • 使用参数异常项,针对特定的参数值设置单独的限流QPS阈值,而不影响其他参数值的配置

Sentinel中配置参数异常项一般通过代码实现:

ParamFlowRule rule = new ParamFlowRule(resourceName)
    .setParamIdx(0) // 参数的索引位置
    .setCount(5); // 针对所有参数值设置的限流阈值

// 针对参数值 "特定值" 设置特殊的限流规则
ParamFlowItem item = new ParamFlowItem()
    .setObject("特定值")
    .setClassType(String.class.getName())
    .setCount(1); // 针对参数值 "特定值" 设置的限流阈值

rule.getParamFlowItemList().add(item);
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));

代码中,对方法中第一个参数的全局流量设置了QPS5,对于参数值为特定值的情况单独设置了QPS1的限流阈值。

参数异常项的配置也可以通过Sentinel Dashboard图形界面来设置,只需选择对应的规则并添加参数特例即可。

需要注意的是,参数异常项的配置是基于热点参数的,这意味着如果你没有开启热点限流,则参数异常项也无法工作。

对热点参数进行限流本质上是一种细粒度的流量控制手段,能够为系统提供更高级别的保护。 也应适度地使用热点限流规则,避免过度复杂化限流配置,并且考虑到可能的性能影响。


results matching ""

    No results matching ""