转载自  热点参数限流

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(九)之热点参数限流相关推荐

  1. Spring Cloud Alibaba:Sentinel 热点参数限流

    文章目录 1. 前言 2. 热点规则配置 3. 参数例外项 1. 前言 Sentinel版本:1.8.0 何为热点?热点即经常访问的数据.很多时候我们希望统计某个热点数据中访问频次最高的 Top K ...

  2. SpringCloud Sentinel 熔断降级、热点参数限流、与系统自适应限流介绍与配置

    一.熔断降级介绍与配置 概述:除了上一章节讲解的sentinel的流量控制之外,sentinel还提供了熔断降级功能.与处理高并发的系统自我保护机制不同的是,熔断降级主要防止当前接口不可用时,导致依赖 ...

  3. 手把手带你领略双十一背后的核心技术Sentinel之热点参数限流

    文章目录 1.何为热点 2.基本使用1 3.基本使用2 1.何为热点 热点就是经常访问的数据,我们通常希望对某个访问次数最高的热点数据进行限制. 比如说商品中的某个访问量很高的商品.比如说商品中的某个 ...

  4. 问道阿里哨兵Sentinel框架_仪表盘_限流_v0.0.2

    文件名称 版本号 作者 qq 版本 问道阿里哨兵Sentinel框架_仪表盘_限流 v0.0.2 若布与宫合 8416837 SpringBoot 2.2.2 Spring-cloud-starter ...

  5. Sentinel系列之热点限流

    热点数据:就是那些经常被访问或者经常出现的数据,所以针对这种数据就会进行限流,比如针对刷单,同一个账号或者同一个ip进来的用户进行限流等等 Sentinel提供了热点参数限流的策略,其实就是一种特殊的 ...

  6. Sentinel笔记(四)热点限流

    如何在项目中添加Sentinel的支持请看这里 Sentinel笔记(一)第一个监控实例 文章目录 介绍 新增热点规则 参数例外项 支持的数据类型 介绍 官网 何为热点?热点即经常访问的数据.很多时候 ...

  7. 九.Sentinel限流熔断应用实践

    Sentinel简介 背景分析 在我们日常生活中,经常会在淘宝.天猫.京东.拼多多等平台上参与商品的秒杀.抢购以及一些优惠活动,也会在节假日使用12306 手机APP抢火车票.高铁票,甚至有时候还要帮 ...

  8. springcloud(十六)--SpringCloud Alibaba Sentinel实现熔断与限流

    Sentinel实现熔断与限流 一.Sentinel 二.安装Sentinel控制台 Sentinel安装步骤: ①下载 ②运行命令 ③访问sentinel管理界面 三.初始化演示工程 1.启动Nao ...

  9. 阿里巴巴开源限流降级神器Sentinel大规模生产级应用实践

    作者:丁浪,目前在创业公司担任高级技术架构师.曾就职于阿里巴巴大文娱和蚂蚁金服.具有丰富的稳定性保障,全链路性能优化的经验.架构师社区特邀嘉宾! 前言 互联网上关于限流算法.Sentinel功能介绍. ...

最新文章

  1. Application Session Cookie ViewState Cache Hidden 区别
  2. SpringCloud入门[转]
  3. Hive中数据的加载和导出
  4. ntoskrnl.exe文件丢失或损坏的解决方法
  5. CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
  6. 中心化(又叫零均值化)和标准化(又叫归一化)
  7. 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...
  8. Spring WebSocket初探2 (Spring WebSocket入门教程)
  9. 48、多用块枚举,少用for循环
  10. dedecms右侧悬浮_织梦dedecms网站上添加漂浮广告
  11. python在线作业_南开大学20春学期《Python编程基础》在线作业参考答案
  12. 什么是大数据,大数据到底应该如何学?
  13. 【每日蓝桥】2、一三年省赛JavaC组真题“组素数”
  14. spring4.x(13)---SpringEL-操作List、Map
  15. 2017.3.16 下午
  16. 《云网络:数字经济的连接》图书发布会将于7月16日在杭举行
  17. vs2003在win7+后pdb锁住报LNK1201解决方案
  18. 【JESD204B】基于JESD204B协议的ADC、DAC数据传输
  19. Win10插入U盘无反应,但是U盘是正常的解决方法
  20. 全面正面解读:nmn的副作用和危害怎么样?nmn副作用及应对方法?

热门文章

  1. leetcode377. 组合总和 Ⅳ
  2. leetcode637. 二叉树的层平均值(层序遍历04)
  3. leedcode344. 反转字符串
  4. Java用TCP手写聊天室 可以 私聊版加群聊版
  5. [数据结构]树、森林与二叉树之间的相互转换方法
  6. [JavaWeb-HTTP]request对象继承体系结构
  7. [C++STL]stack容器用法介绍
  8. [Java基础]接口基础
  9. java进阶之注解篇
  10. CMake编译opencv