Sentinel(九)之热点参数限流
转载自 热点参数限流
Overview
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。
基本使用
要使用热点参数限流功能,需要引入以下依赖:
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-parameter-flow-control</artifactId><version>x.y.z</version>
</dependency>
然后为对应的资源配置热点参数限流规则,并在 entry
的时候传入相应的参数,即可使热点参数限流生效。
注:若自行扩展并注册了自己实现的
SlotChainBuilder
,并希望使用热点参数限流功能,则可以在 chain 里面合适的地方插入ParamFlowSlot
。
那么如何传入对应的参数以便 Sentinel 统计呢?我们可以通过 SphU
类里面几个 entry
重载方法来传入:
public static Entry entry(String name, EntryType type, int count, Object... args) throws BlockExceptionpublic static Entry entry(Method method, EntryType type, int count, Object... args) throws BlockException
其中最后的一串 args
就是要传入的参数,有多个就按照次序依次传入。比如要传入两个参数 paramA
和 paramB
,则可以:
// paramA in index 0, paramB in index 1.
// 若需要配置例外项或者使用集群维度流控,则传入的参数只支持基本类型。
SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB);
注意:若 entry 的时候传入了热点参数,那么 exit 的时候也一定要带上对应的参数(exit(count, args)
),否则可能会有统计错误。正确的示例:
Entry entry = null;
try {entry = SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB);// Your logic here.
} catch (BlockException ex) {// Handle request rejection.
} finally {if (entry != null) {entry.exit(1, paramA, paramB);}
}
对于 @SentinelResource
注解方式定义的资源,若注解作用的方法上有参数,Sentinel 会将它们作为参数传入 SphU.entry(res, args)
。比如以下的方法里面 uid
和 type
会分别作为第一个和第二个参数传入 Sentinel API,从而可以用于热点规则判断:
@SentinelResource("myMethod")
public Result doSomething(String uid, int type) {// some logic here...
}
热点参数规则
热点参数规则(ParamFlowRule
)类似于流量控制规则(FlowRule
):
属性 | 说明 | 默认值 |
---|---|---|
resource | 资源名,必填 | |
count | 限流阈值,必填 | |
grade | 限流模式 | QPS 模式 |
durationInSec | 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 | 1s |
controlBehavior | 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 | 快速失败 |
maxQueueingTimeMs | 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 | 0ms |
paramIdx |
热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
|
|
paramFlowItemList |
参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
|
|
clusterMode | 是否是集群参数流控规则 |
false
|
clusterConfig | 集群流控相关配置 |
我们可以通过 ParamFlowRuleManager
的 loadRules
方法更新热点参数规则,下面是一个示例:
ParamFlowRule rule = new ParamFlowRule(resourceName).setParamIdx(0).setCount(5);
// 针对 int 类型的参数 PARAM_B,单独设置限流 QPS 阈值为 10,而不是全局的阈值 5.
ParamFlowItem item = new ParamFlowItem().setObject(String.valueOf(PARAM_B)).setClassType(int.class.getName()).setCount(10);
rule.setParamFlowItemList(Collections.singletonList(item));ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
示例
示例可参见 sentinel-demo-parameter-flow-control。
Sentinel(九)之热点参数限流相关推荐
- Spring Cloud Alibaba:Sentinel 热点参数限流
文章目录 1. 前言 2. 热点规则配置 3. 参数例外项 1. 前言 Sentinel版本:1.8.0 何为热点?热点即经常访问的数据.很多时候我们希望统计某个热点数据中访问频次最高的 Top K ...
- SpringCloud Sentinel 熔断降级、热点参数限流、与系统自适应限流介绍与配置
一.熔断降级介绍与配置 概述:除了上一章节讲解的sentinel的流量控制之外,sentinel还提供了熔断降级功能.与处理高并发的系统自我保护机制不同的是,熔断降级主要防止当前接口不可用时,导致依赖 ...
- 手把手带你领略双十一背后的核心技术Sentinel之热点参数限流
文章目录 1.何为热点 2.基本使用1 3.基本使用2 1.何为热点 热点就是经常访问的数据,我们通常希望对某个访问次数最高的热点数据进行限制. 比如说商品中的某个访问量很高的商品.比如说商品中的某个 ...
- 问道阿里哨兵Sentinel框架_仪表盘_限流_v0.0.2
文件名称 版本号 作者 qq 版本 问道阿里哨兵Sentinel框架_仪表盘_限流 v0.0.2 若布与宫合 8416837 SpringBoot 2.2.2 Spring-cloud-starter ...
- Sentinel系列之热点限流
热点数据:就是那些经常被访问或者经常出现的数据,所以针对这种数据就会进行限流,比如针对刷单,同一个账号或者同一个ip进来的用户进行限流等等 Sentinel提供了热点参数限流的策略,其实就是一种特殊的 ...
- Sentinel笔记(四)热点限流
如何在项目中添加Sentinel的支持请看这里 Sentinel笔记(一)第一个监控实例 文章目录 介绍 新增热点规则 参数例外项 支持的数据类型 介绍 官网 何为热点?热点即经常访问的数据.很多时候 ...
- 九.Sentinel限流熔断应用实践
Sentinel简介 背景分析 在我们日常生活中,经常会在淘宝.天猫.京东.拼多多等平台上参与商品的秒杀.抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票.高铁票,甚至有时候还要帮 ...
- springcloud(十六)--SpringCloud Alibaba Sentinel实现熔断与限流
Sentinel实现熔断与限流 一.Sentinel 二.安装Sentinel控制台 Sentinel安装步骤: ①下载 ②运行命令 ③访问sentinel管理界面 三.初始化演示工程 1.启动Nao ...
- 阿里巴巴开源限流降级神器Sentinel大规模生产级应用实践
作者:丁浪,目前在创业公司担任高级技术架构师.曾就职于阿里巴巴大文娱和蚂蚁金服.具有丰富的稳定性保障,全链路性能优化的经验.架构师社区特邀嘉宾! 前言 互联网上关于限流算法.Sentinel功能介绍. ...
最新文章
- Application Session Cookie ViewState Cache Hidden 区别
- SpringCloud入门[转]
- Hive中数据的加载和导出
- ntoskrnl.exe文件丢失或损坏的解决方法
- CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
- 中心化(又叫零均值化)和标准化(又叫归一化)
- 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...
- Spring WebSocket初探2 (Spring WebSocket入门教程)
- 48、多用块枚举,少用for循环
- dedecms右侧悬浮_织梦dedecms网站上添加漂浮广告
- python在线作业_南开大学20春学期《Python编程基础》在线作业参考答案
- 什么是大数据,大数据到底应该如何学?
- 【每日蓝桥】2、一三年省赛JavaC组真题“组素数”
- spring4.x(13)---SpringEL-操作List、Map
- 2017.3.16 下午
- 《云网络:数字经济的连接》图书发布会将于7月16日在杭举行
- vs2003在win7+后pdb锁住报LNK1201解决方案
- 【JESD204B】基于JESD204B协议的ADC、DAC数据传输
- Win10插入U盘无反应,但是U盘是正常的解决方法
- 全面正面解读:nmn的副作用和危害怎么样?nmn副作用及应对方法?