Sentinel 系统自适应限流原理剖析与实战指导

简介: Sentinel 系统自适应限流原理剖析与实战指导

1、Sentinel 系统自适应概述


从官方了解到 Sentienl 系统自适应限流是一个全局的概念,对应用入口流量统一进行统一控制,结合应用的机器负载、CPU 使用率,总体平均响应时间、入口 QPS 和并发线程数等几个维度的监控指标从而决定是否调用进行限流操作。为了有一个直观的感受,我们可以从官方的运维平台看看其系统自适应限流的操作界面:

020f54ce30653e18986e79f4650894f2.png

RT、线程数、入口QPS这三个指标是可以通过采集调用信息进行统计计算的,那系统LOAD、CPU使用率是如何获取的呢?大家可以带着这个问题进入本文的学习中来。


在详细分析系统自适应实现原理之前我们先来思考一下 Sentinel 引入该机制的目的。

官方文档针对这个问题有过仔细阐述,我们先来看看官方文档对其阐述。


引入系统自适应限流的主要的目的有如下两个:


  • 保证系统不被拖垮
  • 在系统稳定的前提下保证系统的吞吐量。


目前我们接触的限流的防护思路都是设定一个指标(阔值),例如系统的负载 load 超过某个阔值后就阻止或减少流量的继续进入,当系统负载降低到某一水平后则恢复流量的进入。通常都是被动的,其实际效果取决于阔值设置是否合理,但往往设置合理不是一件容易的事情。


那 Sentinel 提供的系统自适应是可以将设定的规则作为一个保护因子,而允许通过的流量由处理请求的能力来决定,即根据请求的响应时间、当前系统正在处理的请求速率来决定。


那 Sentinel 是如何实现的呢?接下来用源码的手段来揭晓其实现原理。


2、系统自适应限流原理


Sentinel 执行系统限流的核心入口类为 SystemSlot,该类实现简单,如下图所示:

32f6659f599f9c70d0144f1eeb0aa6ca.png

从这里可以看出实现的关键在于SystemRuleManager,这里是直接调用 checkSystem 进行是否触发其限流,那我们接下来重点跟踪一下该方法的实现。


2.1 自适应限流检测流程


系统自适应限流检测具体由 SystemRuleManager 的 checkSystem 方法实现,接下来详细剖析其实现细节。

75d24e315d79136ef61ee04702f7d864.png

Step1:验证相关资源,主要包含三层验证:


  • 如果资源名称为空,则直接跳过,这个是容错机制。
    如果系统自适应开关为打开,直接放行,该开关初始化时为 false,在加载到一条系统自适应配置规则时该状态会设置为 true,具体在 loadSystemConf 中。
    如果资源的类型不是入口流量(EntryType.IN),则直接放行。

a33930823692826bb8c6c06c7bee21b7.png

Step2:从QPS为维度验证是否需要被限流,其实现关键点如下:


  • 当前的qps,如果 ENTRY_NODE 为空则返回0,否则返回该统计节点的成功 qps,那 ENTRY_NODE 统计节点是“何许人也”,原来是 Sentinel 特定定义了一个资源,其名称为total_inbound_traffic,用来采集所有入口调用的信息,当资源进入类型为 ENTRY_TYPE_IN 时,会自动采集信息,其具体统计信息在 StatisticSlot 的 entry 方法中被调用,其截图如下:

dc25f21b9dcd738f747e1ec24ac22b9a.png

如果当前调用的 QPS 大于设定的QPS,即触发限流,那这个 qps 又是在什么时候被设置的呢?也是在加载系统限流规则时被设置,如果一个应用同一个限流点(LOAD、QPS)设置了多条规则,最小值生效。


b892503cea615afe2ff4dc0370baecbc.png

Step3:关于线程数、响应时间限流模式与QPS类似,就不再重复介绍。

28ec37585fcec4207330d93c46e29101.png

Step4:如果当前系统的负载超过了设定的阔值的处理逻辑,这里就是自适应的核心所在,并不是超过负载就限流,而是需要根据当前系统的请求处理能力进行综合判断,具体逻辑在 checkBbr 方法中实现。关于如何获得系统负载与 checkBbr 方法稍后会详细介绍。

831e7e6856e22122728d0847b270a322.png

Step5:如果当前CPU的负载超过了设置的阔值,触发限流,那在JAVA中是如何获取CPU的使用率的呢?稍后详细介绍。


2.2 根据系统负载自适应算法详解


正如上面的第4步骤,根据系统 Load 的会采用 TCP BBR 算法来评估是否限流,具体实现代码如下:

27d039e16b856f39a791aaa16fa14830.png

在 Sentinel 中估算系统的容量是以 1s 为度量长度,用该秒内通过的最大 qps 与 最小响应时间的乘积来表示,具体的计算细节:


  • maxSuccessQps 的计算取当前采样窗口的最大值乘以1s内滑动窗口的个数,这里其实并不是十分准确。
  • minRt 最小响应时间取自当前采样窗口中的最小响应时间。
    故得出了上述计算公式,除以1000是因为 minRt 的时间单位是毫秒,统一为秒。从这里可以看出根据系统负载做限流,最终的判断依据是线程数量。


2.3 JAVA如何获得操作系统负载情况


在 Sentinel 中获取操作系统负载情况的类:SystemStatusListener,每秒采集一次。

425c6b42d260a4334c0d8dd0ae559123.png

原来可以通过JDK中的 com.sun.management.OperatingSystemMXBean 获取操作系统相关的信息。


温馨提示:上述只对 Linux/Unix 操作系统有效,对 windows 无效。

3、实践思考


经过上面的分析,Sentinel 中的系统自适应其实指的是按照应用所在机器的操作系统负载,再结合应用本身的请求处理能力进行的自适应,操作系统的负载情况可以通过 top 命令输出,其示例如下:

6db49b8753e28a2786b6adacc68adf71.png

尽管 Sentienl 的系统规则配置类型分为 LOAD、CPU、RT、线程数、入口QPS等维度进行限流,但自适应主要是针对 LOAD 这种情况的。


Sentinel 系统级别的限流规则并不是针对某一个资源,而是针对应用所有定义EntryType.IN的资源,在使用时尤其需要注意,特别是如果一个机器上部署了多个应用,可能会造成应用本身负载不高,但所在的机器由于其他应用程序导致资源负载偏高,从而触发限流。

相关文章
|
4月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
99 1
|
6月前
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
168 3
|
2月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
2月前
|
监控 Java 双11
Sentinel底层如何计算京东双十一线上系统实时QPS
【10月更文挑战第19天】随着电子商务行业的快速发展,双十一已成为全球最大的购物狂欢节。京东作为中国领先的电商平台,每年的双十一活动都会迎来巨大的流量高峰。为了保障系统在高并发情况下的稳定运行,京东采用了多种技术手段来应对。
45 0
|
2月前
|
运维 监控 算法
聊一聊Sentinel背后的原理
本文介绍了Sentinel的核心原理,包括流量控制、熔断降级、系统负载保护、实时监控和统计、与多种微服务框架的集成能力以及扩展性,强调了Sentinel在保障分布式系统稳定性方面的重要性。
147 0
|
4月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
5月前
|
监控 算法 Java
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之配置Sentinel的流量控制规则问题如何解决
|
3月前
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
5月前
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
248 0
|
5月前
|
监控 Dubbo 应用服务中间件
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
54 0