【Sentinel系列】热点数据流量控制

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

热点数据限流还有以下使用场景:

  • 写数据的服务,业务系统提供录入数据的服务,数据写入数据库之类的存储系统,存储系统的底层会加锁写磁盘上的文件,部分存储系统会将某一类数据写入同一个文件,如果底层写入数据到同一份文件,会出现抢占锁的情况,导致出现大量超时和失败,出现这种情况,有修改存储设计、对热点参数限流两种解决方法。

Sentinel通过LRU策略和滑动窗口机制来实现热点参数的统计,LRU策略可统计单位时间内最常访问的热点数据,滑动窗口机制可协助统计每个参数的QPS。

Sentinel根据请求的参数来判断哪些是热点参数,然后通过热点参数限流规则,将QPS超过设定阈值的请求阻塞,具体流程如下图所示:

image-20211126235026375.png

热点参数数据限流

添加热点参数限流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进入【实时监控】来查看限流具体情况。

猜你喜欢

转载自juejin.im/post/7035157414236127240