十、Sentinel之热点参数限流

发布时间 2023-07-04 21:27:16作者: shigp1

一、介绍

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

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

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

 

 

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

二、演示基础使用

资源定义:

@RequestMapping("/hotKey")
@SentinelResource("HelloConsumer-hotKey")
public String hotKey(@RequestParam(value = "a",required = false) String a,@RequestParam(value = "b",required = false) String b) {
    return "hotKey---";
}

在统计时长内QPS超过阈值且当请求中有参数a时触发热点限流。重启程序后在Sentinel dashboard 配置热点规则:
 

 

发现热点参数限流只支持QPS模式,参数索引填0,即上面的参数a。在浏览器中访问http://localhost:7001/consumer/hotKey?b,快速点击,多访问几次,发现都能访问成功。在浏览器中访问http://localhost:7001/consumer/hotKey?a,快速点击,多访问几次,发现被限流:
 

 

发现限流提示不友好。

 

@SentinelResource中有blockHandler属性,用于处理发生限流时的操作。

@RequestMapping("/hotKey")
@SentinelResource(value = "HelloConsumer-hotKey",blockHandler = "handleHotKeyError")
public String hotKey(@RequestParam(value = "a",required = false) String a,@RequestParam(value = "b",required = false) String b) {
    return "hotKey---";
}

public String handleHotKeyError(String a, String b, BlockException e) {
    return "系统繁忙中...";
}

blockHandler中的方法名handleHotKeyError的参数和hotKey方法中的参数相同,只是最后面多了BlockException参数。当发生限流时,执行handleHotKeyError。

 

重启程序,重新配置Sentinel热点参数限流规则,在浏览器中访问http://localhost:7001/consumer/hotKey?a,快速点击,多访问几次,显示:
 

 

三、参数例外项

当点击热点参数限流的高级选项,发现参数例外项
 

 
当配置参数例外项后,如果请求中出现配置的参数值,则使用配置的参数例外项中的QPS阈值。否则使用参数例外项上面的配置的阈值。且参数例外项只支持以上7种类型。

 

配置Sentinel 热点参数例外项:
 

 
当参数a的值为aa时,QPS阈值是200,否则QPS阈值是1。

 

在浏览器中访问http://localhost:7001/consumer/hotKey?a=1,快速点击,多访问几次,显示:
 

 
被限流了。

 

在浏览器中访问http://localhost:7001/consumer/hotKey?a=aa,快速点击,多访问几次,显示:
 

 

发现没有被限流。

 

配置jmeter:
 

 

配置QPS是300。
 

 

访问http://localhost:7001/consumer/hotKey?a=aa。
 

查看结果树中后面的请求的响应数据:
 

 

发现被限流。