前言
当经常访问的数据过热时,可以对其访问进行限流。例如:针对一段时间内的特定的用户、城市等进行限制。可以优先用于redis热点key的限流中。
另:本文只做规则说明,实战时可做参考,源码解析部分详见:
一、参数说明
热点参数限流由规则ParamFlowRule负责,下面看下各个属性的含义。
参数 | 说明 |
---|---|
resource | 必填项,资源名称 |
limitApp | 授权使用限制来源方,默认default |
grade | 0:线程数(客户端并发控制)1:QPS(默认) |
paramIdx | 必填项,热点参数索引位置 对应SphU.entry(xxx, args)中的参数索引位置 |
count | 必填项,限流阈值 |
controlBehavior | 0:直接拒绝(默认)2:匀速通过 |
maxQueueingTimeMs | 当controlBehavior=2时,排队等待时间 |
burstCount | 应对突发流量额外允许的数量 |
durationInSec | 统计窗口时间长度,默认1秒 |
paramFlowItemList | 额外选项,针对特定的参数单独限流 |
clusterMode | 是否为集群模式,默认false |
clusterConfig | 集群限流配置 |
二、参数格式
1.不带额外项JSON格式
[
{
"burstCount": 0,
"clusterMode": false,
"controlBehavior": 0,
"count": 5,
"durationInSec": 1,
"grade": 1,
"limitApp": "default",
"maxQueueingTimeMs": 0,
"paramFlowItemList": [],
"paramIdx": 0,
"resource": "resA"
}
]
2.带额外项JSON格式
[
{
"burstCount": 0,
"clusterMode": false,
"controlBehavior": 0,
"count": 5,
"durationInSec": 1,
"grade": 1,
"limitApp": "default",
"maxQueueingTimeMs": 0,
"paramFlowItemList": [
{
"classType": "int",
"count": 10,
"object": "2"
}
],
"paramIdx": 0,
"resource": "resA"
}
]
三、使用方式
注意:exit的时候也一定要带上对应的参数(exit(count, args)),否则可能会有统计错误
Entry entry = null;
try {
entry = SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB);
// 业务逻辑
} catch (BlockException ex) {
// 发送流控
} finally {
if (entry != null) {
entry.exit(1, paramA, paramB);
}
}
作者丨梁勇
来源丨瓜农老梁
欢迎关注公众号「瓜农老梁」