暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

springcloud微服务-Sentinel 实现热点参数限流 三

懒人实录 2021-02-24
797

一、热点

热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制

用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

二、如何应用

1、新建 TestHostController

2、新建HostService

getBody方法,方法上面增加注解@SentinelResource;对于 @SentinelResource 注解方式定义的资源,若注解作用的方法上有参数,Sentinel 会将它们作为参数传入 SphU.entry(res, args)。
比如上面的方法里面 a 和 b 会分别作为第一个和第二个参数传入 Sentinel API,从而可以用于热点规则判断。

请求接口

http://localhost/test/host?a=aaa&b=bbb

在Sentinel控制台簇点链路里面多了个hot资源名

热点规则

设置一下hot的热点规则

  • 限流模式只有QPS模式。

  • 参数索引代表@SentinelResource注解的方法参数,0代表第一个参数,1代表第二个参数。

  • 单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。 
    上图的含义就是第一个参数有值的话,1秒的QPS为1,超过就限流 


上面请求/test/host是带上了第一个参数a,触发了热点限流
上面请求/test/host带上了第二个参数b,没有第一个参数a,不触发热点限流

特定参数

上文中我们配置了针对参数索引的热点限流,有时候我们需要对参数的值做一些特殊的规格;如:上文表示了请求地址如果有参数a,就触发热点限流QPS为1。
但有的业务需要参数a=aaa时,QPS要放大;

应用的场景:秒杀商品,分配给他们大点的QPS。那怎么设置?
Sentinel控制台要在热点规则那边,点击编辑按钮


参数例外项:上图配置的含义就是hot资源名配置了第一个参数进行热点限流,阀值为1;但第一参数值为aaa时,限流阀值变为4。


测试验证了参数值为aaa时,阀值变大了。

热点参数规则
属性说明    默认值
resource资源名,必填
count限流阈值,必填    
grade限流模式QPS 模式
durationInSec统计窗口时间长度(单位为秒),1.6.0 版本开始支持1s
controlBehavior流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持快速失败
maxQueueingTimeMs最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持0ms
paramIdx热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型    
clusterMode是否是集群参数流控规则false
clusterConfig集群流控相关配置
总结

热点参数限流规则主要是针对请求参数来统计,并实现限流的。首先热点参数是基于QPS统计,如果参数索引设置为0,则以第一个参数统计为准,阈值也是按照基本参数中的阈值来控制的,但是指定的是额外的参数列表的下标,则需要提供指定的热点参数的值,如果当前访问的参数与预设定的参数不一致,依旧与第一个参数的阈值为准。


文章转载自懒人实录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论