前言
当经常访问的数据过热时,可以对其访问进行限流。例如:针对一段时间内的特定的用户、城市等进行限制。可以优先用于redis热点key的限流中。
另:本文只做规则说明,实战时可做参考,源码解析部分详见:
《Sentinel热点参数如何限流【原理源码】》
一、参数说明
热点参数限流由规则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);
}
}