这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
热点数据限流还有以下使用场景:
- 写数据的服务,业务系统提供录入数据的服务,数据写入数据库之类的存储系统,存储系统的底层会加锁写磁盘上的文件,部分存储系统会将某一类数据写入同一个文件,如果底层写入数据到同一份文件,会出现抢占锁的情况,导致出现大量超时和失败,出现这种情况,有修改存储设计、对热点参数限流两种解决方法。
Sentinel通过LRU策略和滑动窗口机制来实现热点参数的统计,LRU策略可统计单位时间内最常访问的热点数据,滑动窗口机制可协助统计每个参数的QPS。
Sentinel根据请求的参数来判断哪些是热点参数,然后通过热点参数限流规则,将QPS超过设定阈值的请求阻塞,具体流程如下图所示:
热点参数数据限流
添加热点参数限流maven依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.7.1</version>
</dependency>
复制代码
创建一个REST接口,并且定义限流埋点。
@RestController
public class ParamRuleController{
private String resourceName="getRule";
public AjaxResult getRule(@PathParam("id") String id){
Entry entry = null;
try{
entry = SphU.entry(resourceName,EntryType.IN,1,id);
return AjaxResult.success();
}catch(Exception e){
e.printStackTrace();
return "block";
}finally{
if(entry != null){
entry.exit();
}
}
}
}
复制代码
针对不同的热点参数,可以通过SphU.entry(resourceName,EntryType.IN,1,id)方法来设置,最后一个参数是一个数组,有多个热点参数时可以按顺序依次传入,Sentinel会对带有这些热点参数请求进行热点限流。
对getRule资源设置热点参数限流规则,通过ParamFlowRuleManager.loadRules方法加载热点参数限流规则
@PostConstruct
public void initParamRule(){
ParamFlowRule rule=new ParamFlowRule(resourceName);
rule.setCount(5);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setParamIdx(0);
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
}
复制代码
可以通过postman调用或者快速刷新浏览器来测试热点参数限流效果,同时可以访问Sentinel Dashboard进入【实时监控】来查看限流具体情况。