Sentinel的热点参数限流

本文介绍了如何在Sentinel中使用热点参数限流功能,基于LRU策略和令牌桶算法实现流量控制。重点讲解了资源名、限流规则、QPS热点规则、参数例外项的概念以及如何通过自定义兜底方法处理异常情况。

何为热点?

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

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

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

Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。

 针对热点参数规则的名词解释

  • 资源名:系统默认路径
  • 限流模式:QPS 热点规则只支持QPS
  • 参数索引:即传入的热点参数索引(从0开始)明确位置
  • 参数例外项:可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型

Sentinel的热点规则

这里我们用到兜底方法

兜底方法分系统默认和用户自定义,系统默认就是之前使用Sentinel时限流,出现的信息Blocked by Sentinel(flow limiting) 就是系统默认

而我们自己定义的方法输出的信息就是用户自定义,比如“系统开小差了,请稍后再试!”

代码片段:

    /**
     * 设置p1为热点参数key
     * @param p1
     * @param p2
     * @return
     */
    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey") //为了确定唯一的资源名称 如果触犯规则就会走兜底方法
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2",required = false) String p2){
        return "-----testHotKey";
    }
    /**
     * 处理热点key兜底的方法
     * @param p1
     * @param p2
     * @param exception
     * @return
     */
    public String deal_testHotKey(String p1, String p2, BlockException exception){
        //用户自定义
        return "系统繁忙开小差了,请稍后再试!"; 
        //sentinel系统默认的提示:Blocked by Sentinel (flow limiting)
    }

对于@SentinelResource这个注解在这里使用是作为实现限流的异常处理

默认情况下,Sentinel对控制资源的限流处理是直接抛出异常。这样对用户交流不友好,我们需要处理一下异常信息 ,所以通过@SentinelResource注解的blockHandler属性制定具体的处理函数即而,当遇到异常限流时,就会实现处理函数方法里面的内容。注意处理函数里面传参必须与资源点的传参一样,并且最后加上BlockException异常参数;同时,返回类型也必须一样

对热点key参数进行限流的尝试

 

 参数索引是0代表对第一个参数进行热点key进行限流,单机阈值=1代表一秒访问一 次,窗口时长是1秒。

测试结果:

第一种情况:一秒刷新一次,没有问题。

第二种情况:突然疯狂刷新,QPS超过1就会进行降级处理走我们自定义的兜底方法 

 在这里我们只对第一个参数p1进行了热点规则的限流处理,而对第二个参数p2没有进行任何配置,它不管是按正常刷新访问还是疯狂刷新,它都没有问题

对热点参数例外项进行限流的尝试:

什么是参数例外项:参数例外项:可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型

理解:

普通:超过1秒后,达到阈值1后马上被限流。(对于第一个案例来说)
非普通:当p1参数值是一个特殊值时,就不会被限流,亦或者是它的阈值设置较高
测试结果:
下面一共三张图,第一张和第二张针对第一个参数指定了两个特殊的参数值,设置阈值较高,就不会出现限流

 

 而第三张还是对第一个参数照旧处理,即QPS超过1秒一次点击后马上就会被限流。

 

### 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、付费专栏及课程。

余额充值