Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义

博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示

在sentinel中,限流的直接表现形式就是,在执行Entry nodeA = SphU.entry(resourceName)的时候抛出FlowException异常,FlowExceptionBlockException的子类,可以捕捉BlockException来自定义被限流之后的逻辑。

并且,对于同一个资源或者不同资源可以分别创建多条限流规则,FlowSlot会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

从上篇博客的demo中我们也可以看到了一些限流规则参数的设置,下面来详细说明以下限流规则中的主要参数。

  • resource: 资源名,即限流规则的作用对象
  • count: 限流阈值
  • grade: 限流阈值类型(QPS或并发线程数)
  • limitApp: 流控针对的调用来源,若为default则不区分调用来源
  • strategy: 限流策略
  • controllerBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)

1.1 限流阈值类型grade(限流纬度)

Sentinel提供了两个纬度 : 并发线程数、QPS

也就是说,我们可以选择根据不同的维度,根据这些纬度的指标去匹配限流规则,一旦达到阈值,则直接触发流量控制。

默认情况下是根据QPS来限流的,这个属性是通过grade进行设置

1.1.1 并发线程数控制

并发数的控制是用于保护业务线程池不被调用耗尽

例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增 加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下 甚至导致线程池耗尽。
为了应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离)。
这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文 切换的 overhead(开销) 比较大,特别是对低延时的调用有比较大的影响。

 Sentinel并发控制不负责创建和管理线程池,而是简单的统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝,效果类似于信号量隔离,原理如下图所示。

 并发线程数的控制参数配置:

grade: RuleConstant.FLOW_GRADE_THREAD
count: 此时它的含义是并发线程数量

1.1.2 QPS流量控制

QPS,表示每秒的查询效率,和时间没有关系,内部使用了滑动窗口算法,原理如下图所示。

 当QPS超过某个阈值的时候,则采取流量控制行为,Sentinel提供了四种流量控制行为。

  • 直接拒绝(CONTROL_BEHAVIOR_DEFAULT)
  • Warm Up(CONTROL_BEHAVIOR_WARM_UP)
  • 匀速排队(CONTROL_BEHAVIOR_RATE_LIMITER, 漏桶算法)
  • 冷启动+匀速器(CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER)

1.2 流量控制行为controlBehavior

1.2.1 直接拒绝行为

直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException

这种方式适用于对系统能力确切一致的情况下,比如通过压测确定了系统的准确水位时。

1.2.2 Warm Up

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。

通过‘冷启动’,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

以下都会随着系统访问量增加逐步预热来提升性能

  • 缓存预热
  • 数据库连接池初始化

如下图所示,当前系统所能够处理的最大并发数是480,首先在最下面的标记位置,系统一直处于空闲状态,接着请求量突然直线升高,这个时候系统并不是直接将QPS拉到最大值,而是在一定的时间内逐步增加阈值,而中间这段时间就是一个系统逐步预热的过程

属性设置:

 controlBehavior: RuleConstant.CONTROL_BEHAVIOR_WARM_UP

warmUpPeriodSec:预热时间,默认60s

1.2.3  匀速排队

匀速排队方式(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,其实对应的就是漏桶算法

当请求数量远远大于阈值时,这些请求就会排队等待,这个等待时间可以设置,如果超过等待时间,那这个请求就会被拒绝。

如下图所示,假设QPS=5,表示请求每200ms才能通过1个,多出的请求排队等待,超过最大排队时间则直接拒绝。

属性设置:

 controlBehavior: RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER

maxQueueingTimeMs:排队等待时间,表示每一次请求最长等待时间, 默认是500ms

 

这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的 场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们 希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接 拒绝多余的请求。

 所以,这里等待时间大一点, 可以保证让所有请求都能正常通过; 假设这里设 置的排队等待时间过小的话, 导致排队等待的请求超时而抛出异常 BlockException, 最终结果可能是这100个并发请求中只有一个请求或几个才 能正常通过, 所以使用这种模式得根据访问资源的耗时时间决定排队等待时 间。

1.3 基于调用关系的流量控制strategy

在分布式架构中,一个请求会包含调用方和被调用方,Sentinel还提供了服务调用关系的流量控制策略,所谓的调用关系,就是根据不同的调用纬度来触发流量控制。

  • 根据调用方限流(STRATEGY_DIRECT)
  • 根据调用链路入口限流(STRATEGY_CHAIN)
  • 具有关系的资源流量控制(STRATEGY_RELATE)

1.3.1 根据调用方限流

顾名思义,假设有两个服务分别是A和B,都想某一个服务C发起请求调用,这个时候我们希望对来自服务B的请求进行限流,那就可以采用调用方限流策略,具体配置如下:

设置FlowRule的strategy为STRATEGY_DIRECT
设置FlowRule的LimitApp,表示指定调用方,这个字段有三种选项:
default ,表示不区分调用者,任何调用者的请求都会进行流量统计。
${some_origin_name} ,针对某个特定的调用者,只有这个调用者的请求才会进行流量控制
other ,表示针对除了 ${some_origin_name} 以外的其他调用方的流量进行流量控制。假设资源 NodeA 配置了一条针对调用者 caller1 的限流规则,接着又配置了一条调用者为 other 的规则,那么任意来自非 caller1 的。对NodeA的调用,请求并发数都不能超过 other 这条规则定义的阈值。

1.3.2 根据调用链路入口限流

一个被限流的保护方法,可能来自于不同的调用链路,比如针对资源NodeA,入口Entrance1Entrance2的请求都调用到了资源NodeA,Sentinel允许只根据某个入口的统计信息对资源限流。

设置方式:

 设置FlowRule中的strategy=STRATEGY_CHAIN

设置FlowRule中的refResource为 Entrance1 来表示只有从入口 Entrance1 的调用才会进行流量控制

 1.3.3 具有关系的资源流量控制

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。

比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写的速度,写的速度过高会影响读的速度。

如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。

可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db和write_db这两个资源分别代表数据库读写,我们可以给read_db设置限流规则来达到写优先的目的。

设置方式

设置FlowRule中的strategy=STRATEGY_RELATE
设置FlowRule中的refResource为 write_db 表示设置关联资源

通过这样的设置后,如果write_db资源超过阈值时,就会对read_db资源进行限流 

2.Sentinel中的熔断机制的应用

熔断是对系统服务器的一种保护机制,如下图所示

 

 

分析:APP容器依赖于下面的几个服务,当访问量比较高的情况下并且此时有一个服务异常或者调用时间特别慢的情况下, 那么一个后端依赖节点的延迟响应就可能导致所有服务器上的所有资源在数秒内直接饱和。一旦出现这个问题,就会导致系统资源被快速消耗,从而导致服务宕机等问题。

那么熔断是如何解决这个问题呢?

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超 时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免 影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间 窗口之内,对该资源的调用都自动熔断

思考: 熔断是根据什么规则来判定资源是否稳定的呢?

  •  慢调用比例(SLOW_REQUEST_RATIO)
  • 异常比例(ERROR_RATIO)
  • 异常数(ERROR_COUNT)

这些纬度,在sentinel中提供了DegradeRule对象来实现规则设置,核心属性如下:

  • resource 资源名称
  • count 阈值,[异常比例/异常模式下的对应阈值,慢调用比例模式下慢调用临界RT]
  • grade,熔断模式,根据RT降级,根据异常比例、根据异常数量
  • timeWindow,熔断时间,单位为秒

2.1 慢调用比例(SLOW_REQUEST_RATIO)

在一定请求次数中,一段时间内,如果有一定比例的请求响应时间大于某一 个阈值,则认为目标服务异常,则在接下来的指定时间内,请求都会被自动熔断。当经过熔断时长后,熔断器会进入到探测恢复状态,若接下来的一个 请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

 假设有一个场景,如果1s内连续发送10个请求,在1分钟以内,其中20%的请求平均响应时间都超过3s,则触发熔断,熔断时间为5s,针对这种情况的设置如下:

1. grade=CircuitBreakerStrategy.SLOW_REQUEST_RATIO, (熔断模式)
2. count=3000,最大的响应时间,单位为(毫秒)
3. TimeWindow=5 (单位为s)
4. minRequestAmount=5,最小请求数量,请求数量小于这个值,即时异常比例超出阈值也不会熔断,默认是5次。
5. slowRatioThreshold=0.2,慢调用比例阈值,仅仅在慢调用比例模式下有效。
6. statIntervalMs=1000*60, 统计时长为60秒,默认为1秒
DegradeRule rule = new DegradeRule(RESOURCE_KEY)
rule.setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType())
// Max allowed response time
rule.setCount(3000)
// Retry timeout (in second)
rule.setTimeWindow(5)
// Circuit breaker opens when slow request ratio > 20%
rule.setSlowRatioThreshold(0.2)
rule.setMinRequestAmount(10)
rule.setStatIntervalMs(60000);

 2.2 异常比例(ERROR_RATIO)

当资源的每秒请求量 >= 5, 并且每秒异常总数占通过量的比值超过阈值时,则触发熔断,配置方式如下:

1. grade=CircuitBreakerStrategy.ERROR_RATIO
2. count(异常比例),范围[0.0 , 1.0],代表0%~100%
3. TimeWindow=5 (单位为s)
4. minRequestAmount,最小请求数量,请求数量小于这个值,即时异常比例超出阈值也不会熔断,默认是5次。

2.3 异常数量(ERROR_COUNT)

当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长 后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求 成功完成(没有错误)则结束熔断,否则会再次被熔断。  

当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

1. grade=CircuitBreakerStrategy.ERROR_COUNT

2. count(异常数量)
3. timeWindow=5 (熔断时间窗口,单位为s)
4. statIntervalMs=60*1000(统计时长,单位为ms)

3.总结

        sentinel是一种系统的保护组件,其提供了限流和熔断,并支持各种策略的配置,开发者可根据具体场景选择合适的策略方式,灵活可扩展,并且sentinel易集成sprigboot,dubbo,nacos等组件,集成度高,还提供了可视化看板供开发者实时监控流量治理情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习笔记(二)

一、Linux文件目录 1.命令:tree -L 1 2.挂载命令(例如U盘,需要挂载之后才能访问): mount /dev/cdrom /mnt ls /mnt 3.查看登录信息: last / lastlog 4.修改/查看网络信息 vi /etc/sysconfig/netw…

【吊打面试官系列】Java高并发篇 - 死锁的原因?

大家好,我是锋哥。今天分享关于 【死锁的原因?】面试题,希望对大家有帮助; 死锁的原因? 1、是多个线程涉及到多个锁,这些锁存在着交叉,所以可能会导致了一个锁依赖 的闭环。 例如: …

计算机网络7——网络安全1 概述与加密

文章目录 一、网络安全问题概述1、计算机网络面临的安全性威胁2、安全的计算机网络3、数据加密模型 二、两类密码体制1、对称密钥密码体制2、公钥密码体制 随着计算机网络的发展,网络中的安全问题也日趋严重。当网络的用户来自社会各个阶层与部门时,大量…

文件跨境传输法律管控越来越严格,企业该如何有效应对?

文件跨境传输已经成为非常普遍的业务需求,企业在世界各地的总分支处、合作伙伴,客户间开展业务时,必须基于数据的跨境流转而展开。 但随着世界各国对数据安全的重视,文件跨境传输也日趋严格,各国在法律法规上均出具了更…

[RK3588-Android12] 关于ES8388 喇叭+PDM回采 4+2配置

问题描述&#xff1a; ES8388 喇叭PDM回采 42配置如下&#xff1a; 解决方案&#xff1a; // MICpdmics: dummy-codec {status "okay";compatible "rockchip,dummy-codec";#sound-dai-cells <0>;};// MICpdm_mic_array: pdm-mic-array {status …

thingsboard接入臻识道闸

thingsboard 和tb-gateway 是通过源码idea启动测试开发 为了测试这里只是买了臻识道闸的摄像机模组方便调试,然后添加一个开关量开关模拟雷达 道闸品牌 臻识C3R3C5R5变焦500万车牌识别相机高速追逃费相机华厦V86像机 淘宝地址 https://item.taobao.com/item.htm?_us1thkikq4…

气膜建筑:无硬件支撑的奇迹—轻空间

气膜建筑是一种创新的建筑形式&#xff0c;其独特之处在于其内部没有任何硬件支撑&#xff0c;仅靠空气吹起来。这种技术是如何实现的呢&#xff1f; 气膜结构的原理 气膜建筑的核心在于其充气结构。通过不断向气膜内部充入空气&#xff0c;气膜内部会维持一个较高的气压。这种…

最新微信发卡小程序 发卡网卡密系统流支持量主

2024.4更新 1.修复分类介绍报错 2.修改前端UI 3.增加插屏弹出广告 4.禁止PC端使用(PC端小程序没有广告) 免费下载&#xff1a;发卡小程序 卡密系统流支持量主 多种卡密领取模式【亲测】_麦田吧 前端演示地址&#xff1a;扫码查看 源码功能&#xff1a; 小程序系统/多种卡密领…

Excel单元格格式无法修改的原因与解决方法

Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法&#xff1a; 单元格或工作表被保护&#xff1a; 如果单元格或工作表被设置为只读或保护状态&#xff0c;您将无法更改其中的格式。解决方法&#xff1a;取消单元格或工作表的保护。在Excel中…

LLC开关电源开发:第一节,LLC原理概述

第一节&#xff0c;LLC原理概述文章目录 一、LLC概述二、LLC电路拓扑1.电路拓扑2.电路工作原理3.电路原理分析 总结 一、LLC概述 LLC电路&#xff0c;是一种通过控制开关频率&#xff08;频率调节&#xff09;来实现输出电压恒定的谐振电路&#xff0c;它包括一个电感L、一个电…

001 仿muduo库实现高性能服务器组件_项目简介

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 一、项目简介二、所需知识储备三、什么是muduo四、Reactor模式单Reactor单线程&#xff1a;单I/O多路复⽤业务…

C语言-02_变量与进制

文章目录 1.关键字2.标识符3.变量3.1 变量的声明与赋值3.2 变量的作用域3.3 变量按类型的分类 4.基本数据类型4.1 整数类型4.1.1 类型说明4.1.2 举例4.1.3 后缀4.1.4 整型的极限值 4.2 浮点类型4.2.1 类型说明4.2.2 举例 4.3 字符类型4.4 布尔类型 5.变量间的运算规则5.1 隐式类…

K8s证书过期处理

问题描述 本地有一个1master2worker的k8s集群&#xff0c;今天启动VMware虚拟机之后发现api-server没有起来&#xff0c;docker一直退出&#xff0c;这个集群是使用kubeadm安装的。 于是kubectl logs查看了日志&#xff0c;发现证书过期了 解决方案&#xff1a; 查看证书 #…

python数据处理中的类型检查与转换技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、类型检查的重要性 二、类型检查与转换技巧 1. 识别数据类型不一致 2. 使用astype()方…

Epic Pen Pro v3 解锁版安装教程 (屏幕实时标记注释工具)

前言 Epic Pen是一款功能强大的屏幕标记工具&#xff0c;允许您在屏幕上绘图或书写&#xff0c;而无需在后台与软件交互。这意味着您几乎可以注释任何东西&#xff01;使用我们流行的屏幕标记和Windows数字白板工具Epic Pen编写、绘制和突出显示&#xff0c;包括演示文稿软件&…

ClickHouse数据管理与同步的关键技术

2024年 5 月 18 日&#xff0c;ClickHouse官方首届杭州 Meetup 活动成功举行。本次活动由 ClickHouse 和阿里云主办&#xff0c;NineData 和云数据库技术社区协办。围绕ClickHouse的核心技术、应用案例、最佳实践、数据管理、以及迁移同步等方面&#xff0c;和行业专家展开交流…

idea中快速找到当前git地址

idea中快速找到当前git地址 然后双击就可以看到地址了

Linux漏洞SSL/TLS协议信息泄露漏洞(CVE-2016-2183) - 非常危险(7.5分) 解决办法!升级openssl

漏洞情况 详细描述 TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及 Triple 3DES存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过Sweet32攻击&…

2023-2024中国区块链年度发展报告

来源&#xff1a;赛迪 近期历史回顾&#xff1a;2024社交媒体全球使用趋势报告.pdf 国际建造成本指数报告2024--产能角逐.pdf 2024可持续包装管理体系与最佳实践案例集.pdf 2024年专利诉讼报告.pdf 2024Q1保险业运行报告.pdf 2024年云指数报告.pdf 2024内容营销10大趋势-内容时…

pytorch-池化层

目录 1. pooling池化层1.1 down sample2.2 Max pooling1.3 Avg pooling1.3 pooling pytorch实现 2. up sample上采样2.1 up sample2.2 pytorch实现 3. ReLU 1. pooling池化层 1.1 down sample 见下图&#xff0c;隔行隔列采样 2.2 Max pooling 下图采用2x2的filter&#x…