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

2024-08-25 09:20

本文主要是介绍解决雪崩的方案之一:流量控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                        ​​​​​​​   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.chinasem.cn/article/1105159

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了