解决雪崩的方案之一:流量控制

news2024/9/24 1:20:02

                        ​​​​​​​   1.簇点链路

2.设置流控模式

2.1设置直接流控模式

2.2.设置关联流控模式

2.3设置链路流控模式

2.4总结

3.设置流控效果

3.1warm up 预热模式

3.2排队等待

3.3总结

4.热点参数限流

4.1全局参数限流

4.2热点参数限流

解决雪崩的方案之一:限流,是为了避免服务因突发的流量而发生故障,是预防措施。

1.簇点链路

当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的⼀个调用链就叫做簇点链路。簇点链路中被监控的每⼀个接口就是⼀个资源。

默认情况下sentinel会监控SpringMVC的每⼀个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每⼀个端点(Endpoint)就是调用链路中的⼀个资源。

流控和熔断都是针对簇点链路中的资源来设置,因此可点击对应资源后面的按钮来设置规则:

  • 流控:流量控制
  • 降级:降级熔断
  • 热点:热点参数限流,是限流的一种
  • 授权:请求的权限控制
2.设置流控模式
2.1设置直接流控模式

要求:给/order/prod/{pid}设置流控规则,QPS不能超过5

2.1.1在sentinel控制台添加限流规则

其中的QPS为每秒查询率,即每秒的响应次数,也就是最大吞吐能力,QPS=请求数req/秒sec

2.2利用jmeter测试

  • 双击jmeter.bat启动jmeter

即可打开jmeter的界面

  • 添加线程组

线程数:代表用户数量

时间:代表用户访问时间

10个线程要在2秒内访问完,那每秒就是访问5个线程

QPS=10/2=5,超过了单机阈值2,所以每秒的5个线程只成功2个,剩下的3个线程会请求失败。

循环次数:代表每个用户的访问次数

  • 添加http请求

端口号:写的是sentinel中资源/order/prod/{pid}的端口号8091

路径:写的是给资源添加流控规则就写那个资源,/order/prod/{pid}

  • 察看结果树

  • 启动测试计划

方式一:单击上面任务栏的启动符号(适用于测试计划中只有一个线程)

方式二:右键单击线程启动(适用于测试计划中有多个线程)

结果:可以看到,成功的请求每次只有2个

2.2.设置关联流控模式

用户购买商品进行下单操作,同时用户要查询订单,业务需求是优先支付和更新订单的业务。因此当下单业务触发阈值时,需要对查询订单业务限流。

2.2.1定义 /order/query和/order/update两个接口在controller层

//关联模式
@GetMapping("/order/query")
public String query(){
    return "查询订单成功";
}

@GetMapping("/order/update")
public String update(){
    return "下单成功";
}

2.2.2配置流控规则

对哪个资源进行限流操作,就对那个资源添加流控规则

我们对/order/query资源进行限流,因此对/order/query添加流控规则:

当 /order/update资源被访问的QPS超过5时,就会对/order/query资源进行限流。

2.2.3进行Jmeter测试

1000个用户,100秒,因此QPS=1000/100=10,超过了我们设置的阈值5,所以结果会是一组请求10个会成功5个失败5个。

我们的请求目标是/order/update,只要这个接口的请求数量超过5,就会对/order/query进行限流操作,在浏览器对/order/query进行访问,发现被限流

2.3设置链路流控模式

链路模式:只针对指定链路访问到本资源的请求做统计,判断数量是否超过阈值。

有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求进行统计,并设置限流。

2.3.1在IOrderService中定义一个方法,用来查询商品。

void queryGoods();

默认情况下sentinel不会对@SentinelResource下的方法监控,所以使用@SentinelResource注解来标记要监控的方法。

@SentinelResource("queryGoods")
public void queryGoods(){
    System.out.println("查询商品");
}
//链路模式
@GetMapping("/order/query")
public String query(){
    //查询商品
    orderService.queryGoods();
    return "查询订单成功";
}

@GetMapping("/order/update")
public String update(){
    //查询商品
    orderService.queryGoods();
    return "下单成功";
}

链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源,会导致链路模式失效。

我们需要关闭这种对SpringMVC的资源聚合,修改order-service服务的application.yml⽂件:

spring:
    cloud:
    sentinel:
    web-context-unify: false # 关闭context整合

2.3.2存在两条统计链路:

  • /order/query --> queryGoods
  • /order/update--> queryGoods

只统计从/order/query进入到 queryGoods的请求,就对 /queryGoods进行配置:

给queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS必须小于2

2.3.3Jmeter测试

对/order/query进行测试:20个用户,4秒内发完,QPS=5,所以5个中会有2个成功,3个失败

如果http请求是/order/update,运行的结果:完全不会受影响

2.4总结

流控模式包括:

  • 直接:对当前的资源进行限流
  • 关联:关联资源触发阈值,对资源进行限流(高优先级资源触发阈值,对低优先级资源限流)
  • 链路:只统计入口资源进入资源的请求,对入口资源进行限流(只统计从指定资源进入当前资源的请求数,是对请求来源的限流)
3.设置流控效果

流控效果是指请求达到流控阈值时应该采取的措施,包括以下三种:

  • 快速失败:达到阈值后,新进来的请求就会立刻被拒绝并抛出FlowException异常(默认)
  • warm up:预热模式,对超出阈值后进来的请求就是拒绝并抛出异常。但它的阈值是动态变化的,在预热时间后,从一个较小值逐步增加到最大阈值QPS
  • 排队等待:让所有的请求排队等待,对超出阈值后进来的请求通过计算等待时间是否在等待时长内,若在,就等待执行;不在则拒绝且抛出异常
3.1warm up 预热模式

阈值一般是一个微服务能承担的最大QPS,但是一个服务刚刚启动时,一切资源尚未初始化(冷启

动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机 。

warm up也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold /

coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而oldFactor的默认值是3.

例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后阈值会在5秒后逐渐增长到10.

要求:给/order/prod/{pid}设置限流,最大QPS是10,利用warm up效果,预热时长为10秒

3.1.1配置流控规则

初始阈值为10/3=3

3.1.2Jmeter测试,QPS是10

刚开始启动时,成功的请求只有三个,说明会QPS被限制在3

随着时间的推移,成功的比例越来越高;直到最后全部成功,达到最大阈值

3.2排队等待

当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。

而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。

工作原理

例如:QPS=5,意味着每200ms处理一个队列中的请求(1s/5=200ms),超时时长为2000,意味着预期等待时长超过2000ms的请求会被拒绝并且抛出异常。

预期等待时长:

现在进来了12个去请求,因为每200ms执行一个请求,所以:

一般来说,可以先计算一下超过阈值的第一个请求以及最后一个请求的等待时长

第六个请求的预期等待时长:200*(6-1)=1000ms

第十二个请求的预期等待时长:200*(12-1)=2200ms

发现第十二请求的预期等待时长超出了2000ms,因此第12个请求会被拒绝

再计算第11个请求的等待时长:200*(11-1)=2000ms,刚好在期限内

所以:12个请求中前十一个会成功,最后一个请求会失败

要求:给/order/prod/{pid}设置限流,最大QPS是10,利用排队等待效果,超时时长设置为5s

3.2.1配置流控规则

QPS=10,所以每100ms处理一个队列中的请求

3.2.2Jmeter测试,QPS是15

计算预期等待时长:

第11个:100*(11-1)=1000ms

第15个:100*(15-1)=1400ms

都小于超时时间5000ms,所以15个请求都会通过

3.3总结

流控效果包括:

  • 快速失败:QPS超过阈值时,直接拒绝新的请求
  • warm up:QPS超过阈值时,拒绝新的请求,但QPS阈值是逐渐提升的,可避免冷启动时高并发导致服务宕机
  • 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求的预期等待时间大于超时时间,直接拒绝
4.热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值;而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值

注意:新增热点规则,不要直接点击hot资源后面的按钮,会有BUG出现,需要点击左侧菜单中的热点规则菜单,再点击新增热点限流规则

热点参数限流对默认的SpringMVC资源无效,需要利用@SentinelResource注解标记资源

4.1全局参数限流

一个根据商品的id查商品的接口

对hot这个资源的0号参数,也就是第一个参数pid做统计,每一秒相同参数值的请求数不能超过5

访问/goods/{id}的请求中,id参数值会有变化,热点参数限流会根据参数值分别统计QPS:

当QPS的值超过设置的阈值时,会对该id的请求进行限流;但其他请求的QPS没有超过阈值5的商品不会影响

4.2热点参数限流

全局参数限流是对所有的商品都进行QPS限定为5;

但在实际开发中有些商品是热点商品,我们希望这部分商品的QPS限制与其他商品不一致,此时就需要使用配置热点参数限流的高级选项。

对0号long类型的参数进行限流,每一秒相同参数的QPS不能超过5,但有两个例外:

如果参数值为1,则每秒内允许的QPS为4

如果参数值为2,则每秒内允许的QPS为10

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

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

相关文章

基于SpringBoot的银行OA系统设计与实现

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot架构,前端使用H5、CSS3、JS和DIV技术 工具:MyEclipse、Navicat f…

种树问题——CSP-J1真题讲解

【题目】 小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息。则小明一共有( ) 种选择时间段的方案 A. 31 B. 18 C. 21 D. 33 【答案】 B 【解析…

前端(Vue)headerSearch(页面搜索)通用解决方案 及 原理

简介 击后弹出输入框输入框可以输入页面的索引,比如项目中包含了文章相关的点击后可以进入对应界面同时也支持英文索引 原理 headerSearch 是复杂后台系统中非常常见的一个功能,它可以:在指定搜索框中对当前应用中所有页面进行检索&#…

stm32MX+freertos在创建task时,选项的含义

任务名称(Task Name): 用于标识任务的名称,便于调试和日志记录。 优先级(Priority): 任务的执行优先级。FreeRTOS支持多个优先级,高优先级的任务会优先于低优先级的任务执行。 堆栈…

功率放大器——前面板操作界面(AWA5871为例)

功率放大器的前面板操作包括多个功能按钮、旋钮和指示灯。如下图所示为AWA5871功率放大器。 1、电源开关(Power Switch) 功能:用于打开或关闭放大器的电源。 操作:按下电源开关,放大器通电并启动;再次按下…

【区块链 + 航运物流】运力链 | FISCO BCOS应用案例

根据速达物联的战略规划,2023年物流平台将由单一调度平台升级为物流生态平台。基于此,虎彩集团采用 FISCO BCOS区块链技术构建的运力链,可以帮助客户实现资源广泛快速连接、合作伙伴间的高效协同和低摩擦交 易,最终达成可信同城货…

redis面试(二十一)读写锁互斥

读锁非互斥 非互斥的意思就是,一个客户端或者线程加锁之后,另一个客户端线程也可以来进行加锁。 还是拿着ReadLock的lua脚本来看看 刚才我们已经分析过第一个线程来加读锁的逻辑了 所以上半截不用重复说了, hset anyLock mode read hset an…

AI周报(8.18-8.24)

AI应用-XGO-Rider: 全球首款轮腿式桌面 AI 机器人 中国的 Luwu 智能打造的XGO-Rider 是全球首款轮腿式桌面 AI 机器人。这个小巧紧凑的机器人将轮式机器人的灵活性与腿式机器人的障碍处理能力相结合,可以全方位移动,轻松适应各种地形。 XGO-Rider 主要设…

如何使用ssm实现亿互游在线平台设计与开发+vue

TOC ssm118亿互游在线平台设计与开发vue 绪论 1.1研究背景 时代的发展,我们迎来了数字化信息时代,它正在渐渐的改变着人们的工作、学习以及娱乐方式。计算机网络,Internet扮演着越来越重要的角色,人们已经离不开网络了&#x…

AITDK SEO扩展:为网站优化提供一站式解决方案

AITDK SEO扩展:为网站优化提供一站式解决方案 想提升你的网站在搜索引擎中的排名?让我们来看看AITDK SEO扩展,它是你网站优化的得力助手!在这篇文章中,我将为你介绍AITDK SEO扩展的功能特点,以及它如何帮助…

RK3588 技术分享 | 在Android系统中使用NPU实现Yolov5分类检测-迅为电子

随着人工智能和大数据时代的到来,传统嵌入式处理器中的CPU和GPU逐渐无法满足日益增长的深度学习需求。为了应对这一挑战,在一些高端处理器中,NPU(神经网络处理单元)也被集成到了处理器里。NPU的出现不仅减轻了CPU和GPU…

前端——盒子模型

一个盒子的特点组成 外边距就是两个元素之前的距离 padding就是填充区的大小 从上开始 顺时针进行设置,没有则对称 也可以单独对某个方向进行设定,比如:padding-top border 边框区 符合属性 border-style 边框样式 border-color 边框颜色…

web前端之选项卡集合、动态添加类名、动态移除类名、动态添加样式、激活、间距、节流、tabBar

MENU input的checked属性(HtmlStyle)伪元素(HtmlStyleJavaScript)激活类(HtmlStyleJavaScript)vue伪元素 input的checked属性(HtmlStyle) 前言 代码段创建一个使用HTML和CSS实现的标签式内容切换组件。通过选择不同的标签,可以展示相应的内容。 代码段实现一个简洁…

掌握时间的艺术:Python的sched库深度解析

文章目录 掌握时间的艺术:Python的sched库深度解析背景:为何选择sched?什么是sched库?如何安装sched库?简单库函数使用方法1. 创建调度器实例2. 安排事件3. 取消事件4. 运行调度器5. 检查事件是否在队列中 场景应用1. …

iOS profiles文件过期如何更新

创建发布用的Certificates 首先进入到https://developer.apple.com/account页面选择【证书】进入【新建证书】页面 点击【新建证书】按钮: 根据需求选中对应的【证书类型】,我选的是【Apple Distribution】, 开发者证书选择【Apple Devel…

数码管进阶设计验证

前言 随着数字电路和嵌入式系统的广泛应用,数码管作为一种常见的显示设备,在各种电子产品中扮演着重要角色。数码管以其结构简单、显示清晰和成本低廉的特点,广泛应用于计数器、时钟、测量仪器等领域。然而,传统的数码管设计通常仅…

小梅哥 xilinx fpga VGA

module VGA_CTRL(Clk,Reset_n,Data,Data_Req,VGA_HS, //行VGA_VS, //场VGA_BLK, //数据有效的那一段VGA_RGB );input Clk;input Reset_n;input [23:0]Data;output reg Data_Req;output reg VGA_HS;output reg VGA_VS; output reg VGA_BLK;output reg [23:0]VGA_RGB;//{R[7:0]、…

Android常见界面控件(三)

目录 前言 列表控件ListView 常用属性 常用适配器 1.BaseAdapter 2.SimpleAdapter 3.ArrayAdapter 购物商城 选择菜品照片 创建布局文件 实现购物商城列表界面的显示效果 前言 在前面,我们已经讲了六个常用的界面控件和五个界面布局,那么本篇…

【HarmonyOS NEXT星河版开发实战】灯泡定时开关

个人主页→VON 收录专栏→鸿蒙综合案例开发​​​​​ 代码及其图片资源会发布于gitee上面(已发布) 所有与鸿蒙开发有关的知识点都会在gitee上面进行发布 gitee地址https://gitee.com/wang-xin-jie234 目录 前言 界面功能介绍 界面构建思路 头部 中间…

数据结构——二叉树经典OJ题

1.单值二叉树 单值二叉树:就是判断二叉树里的所有值是否都一样 bool isUnivalTree(struct TreeNode* root) {if(rootNULL)return true;//查找有没有左子树并且看左子树当前指向的值是否和根当前指向的值相等if(root -> left && root -> left -> v…