享学课堂特邀作者:老顾
转载请声明出处!
前言
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top N 数据,并对其访问进行限制。比如:
-
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
-
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
那Sentinel是怎么进行热点参数限流的呢?
热点参数
我们先对代码进行一些改造,在控制器增加个方法
我们增加了testHot方法,并在此方法上面增加了注解@SentinelResource;对于 @SentinelResource 注解方式定义的资源,若注解作用的方法上有参数,Sentinel 会将它们作为参数传入 SphU.entry(res, args)。
比如上面的方法里面 a 和 b 会分别作为第一个和第二个参数传入 Sentinel API,从而可以用于热点规则判断。
请求接口
http://localhost/test-hot?a=1&b=2
在Sentinel控制台簇点链路里面多了个hot资源名
热点规则
我们来设置一下hot的热点规则
限流模式只有QPS模式(这才叫热点)。
参数索引代表@SentinelResource注解的方法参数,0代表第一个参数,1代表第二个参数。
单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。
上图的含义就是第一个参数有值的话,1秒的QPS为1,超过就限流
上面请求/test-hot是带上了第一个参数a,触发了热点限流
上面请求/test-hot带上了第二个参数b,没有第一个参数a,不触发热点限流
特定参数
上文中我们配置了针对参数索引的热点限流,有时候我们需要对参数的值做一些特殊的规格;如:上文表示了请求地址如果有参数a,就触发热点限流QPS为1。
但有业务需要参数a=5时,QPS要放大(即业务需要a=5时,阀值调大点,如:100);应用的场景某些秒杀商品,分配给他们大点的QPS。那怎么设置?
Sentinel控制台要在热点规则那边,点击编辑按钮
参数例外项:上图配置的含义就是hot资源名配置了第一个参数进行热点限流,阀值为1;但第一参数值为5时,限流阀值变为100。
注意参数的类型要跟方法中的参数一致
测试验证了参数值为5时,阀值变大了。
适用场景
热点参数其实说白了就是特殊的流控,流控设置是针对整个请求的;但是热点参数他可以设置到具体哪个参数,甚至参数针对的值,这样更灵活的进行流控管理。
一般应用在某些特殊资源的特殊处理,如:某些商品流量大,其他商品流量很正常,就可以利用热点参数限流的方案。
注意点
热点参数的注意点,参数必须是基本类型或者String
也就是方法体上面的参数必须为基本类型或String
总结
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。
今天老顾就介绍到这里,谢谢!!!
如果喜欢本文,可以关注我们的官方账号,第一时间获取资讯。
你的关注是对我们更新最大的动力哦~
今日福利(点击下方文字超链接获取)
如果你的技术提升遇到瓶颈了,或者缺高级Android进阶视频学习提升自己,这有大量大厂面试题为你面试做准备!
最后
按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。
学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
“道路是曲折的,前途是光明的!”
路是曲折的,前途是光明的**!”
[外链图片转存中…(img-YsVduh2t-1623585404571)]
[外链图片转存中…(img-UnLRhGts-1623585404572)]
更多Java核心笔记、真实面经、学习笔记等知识干货可以点击这里免费领取