Wiki地址:WIKI热点参数限流
官网地址:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。 比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。
① controller方法
这里使用注解@SentinelResource定义资源名和异常处理方法deal_testHotKey,该方法针对BlockException 有效。
@SentinelResource处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理。方法运行时报出的运行时异常RunTimeException,@SentinelResource不管。如果需要处理方法运行时异常,可以考虑使用 fallback 配置。
@GetMapping("/testHotKey")
// 名字可以随意起,但为唯一标识
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
// required 表示是否必须包含此参数
public String testHostKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value="p2",required = false)String p2){
System.out.println(p1);
return "testHostKey";
}
public String deal_testHotKey(String p1, String p2, BlockException exception){
return "deal_testHotKey";
}
② 添加热点规则
如下图所示当请求携带了方法参数索引下标为0,也就是第一个参数时,使用如下规则:QPS/1 。
频繁发送请求:http://localhost:8401/testHotKey?p1=a&p2=b,会出现如下提示。这里deal_testHotKey
是我们自定义异常处理方法返回的信息。
从监控界面可以看到拒绝QPS:
③ 不携带p1测试
我们频繁发送请求,http://localhost:8401/testHotKey?p2=b,如下图所示并没有限流
。
上图中第一个资源的通过QPS是第一个资源的2倍,应该是重复统计了,阿里的一个bug。
④ 参数例外项
其实就是特例情况,我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样。假如当p1的值等于5时,它的阈值可以达到200。
我们可以 编辑热点规则,在高级选项那边添加例外项。这里热点参数必须是基本类型或者String。
如下所示,当我们频繁发起请求 http://localhost:8401/testHotKey?p1=5&p2=b,并没有被限流。
但是当我们把请求 修改为 http://localhost:8401/testHotKey?p1=3&p2=b
,QPS大于1时就被限流。
⑤ 系统保护规则
官网文档:系统自适应保护
Sentinel 系统自适应保护从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
如下所示,可以添加不同维护的系统保护规则:其针对的是应用纬度而非资源纬度。
系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 和线程数四个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。
系统规则支持以下的阈值类型:
- Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般是 CPU cores * 2.5。
- CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。
- RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。