sentinel热点参数限流

官方地址:https://github.com/alibaba/Sentinel/wiki/热点参数限流

 

前言

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 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的热点规则

image

限流模式只有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 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。



作者:享学课堂
链接:https://www.jianshu.com/p/e35cf20ddfda
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

### Sentinel 热点参数限流实现原理 #### 参数流量统计机制 热点参数限流的核心在于对特定参数及其值的流量进行精确统计。当接收到请求时,Sentinel会解析并提取指定位置的参数,随后对该参数的不同取值建立独立的计数器来跟踪访问频率[^1]。 #### 阈值判定逻辑 一旦某个具体参数值对应的累计请求数量达到预设阈值,则认为该参数成为“热点”。此时系统依据设定好的策略执行相应的限流措施,比如拒绝新的同类型请求或将超出部分请求延迟处理等操作[^3]。 #### 动态调整能力 为了适应实际业务场景的变化需求,Sentinel允许动态修改受监控的参数索引及对应的最大允许QPS(每秒查询率),而无需重启服务实例即可即时生效这些更改设置[^2]。 ```java // 定义规则示例代码片段 FlowRule rule = new FlowRule(); rule.setResource("/api/example"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); ArrayParamFlowItem item = new ArrayParamFlowItem(); item.setCount(1); // QPS threshold is set to 1 as an example. item.setParamIdx(0); // Limit on the first parameter of the request path. List<ParamFlowItem> paramItemList = Lists.newArrayList(item); rule.setParamItem(paramItemList.toArray(new ParamFlowItem[0])); ``` 通过上述方法论和技术手段的支持下,实现了高效灵活且易于管理维护的热点参数限流功能,在高并发环境下有效保障了系统的稳定性和响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值