Sentinel 热点参数限流

news2024/12/24 21:07:13

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 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 BlockException

public 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));

示例代码

import java.util.Collections;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;

/**
 * This demo demonstrates flow control by frequent ("hot spot") parameters.
 *
 * @author Eric Zhao
 * @since 0.2.0
 */
public class ParamFlowQpsDemo {

    private static final int PARAM_A = 1;
    private static final int PARAM_B = 2;
    private static final int PARAM_C = 3;
    private static final int PARAM_D = 4;

    /**
     * Here we prepare different parameters to validate flow control by parameters.
     */
    private static final Integer[] PARAMS = new Integer[] {PARAM_A, PARAM_B, PARAM_C, PARAM_D};

    private static final String RESOURCE_KEY = "resA";

    public static void main(String[] args) throws Exception {
        initParamFlowRules();

        final int threadCount = 20;
        ParamFlowQpsRunner<Integer> runner = new ParamFlowQpsRunner<>(PARAMS, RESOURCE_KEY, threadCount, 120);
        runner.tick();

        Thread.sleep(1000);
        runner.simulateTraffic();
    }

    private static void initParamFlowRules() {
        // QPS mode, threshold is 5 for every frequent "hot spot" parameter in index 0 (the first arg).
        ParamFlowRule rule = new ParamFlowRule(RESOURCE_KEY)
            .setParamIdx(0)
            .setGrade(RuleConstant.FLOW_GRADE_QPS)
            //.setDurationInSec(3)
            //.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
            //.setMaxQueueingTimeMs(600)
            .setCount(5);

        // We can set threshold count for specific parameter value individually.
        // Here we add an exception item. That means: QPS threshold of entries with parameter `PARAM_B` (type: int)
        // in index 0 will be 10, rather than the global threshold (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));
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prompt工程师指南[资料整合篇]:Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等,超全面资料

Prompt工程师指南[资料整合篇]&#xff1a;Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等&#xff0c;超全面资料 1.论文合集 The following are the latest papers (sorted by release date) on prompt engineering. We update this on a daily bas…

Ozeki VOIP SIP SDK 10.3.199 Crack

Ozeki VOIP SIP SDK 使用Ozeki VoIP SIP SDK&#xff0c;您有机会制作自己的VoIP产品&#xff0c;例如软电话&#xff0c;甚至您自己的PBX。 Ozeki VoIP SIP SDK介绍 Ozeki VoIP SIP SDK 是一个软件开发工具包&#xff0c;允许您使用 SIP 协议进行 VoIP 呼叫。它可以很容易地…

LNMP平台对接redis服务

LNMP见我2023-04-17 10:51:16 发布的企业网站架构部署与优化 LNMP https://blog.csdn.net/Richard_Sniper/article/details/130158518?spm1001.2014.3001.5501 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网&#xff1a;http://redis.io/ 下载包&am…

解读直接RF采样架构及优势

多年来&#xff0c;数字收发机被应用在多种类型的应用中&#xff0c;包括地面蜂窝网络、卫星通信和基于雷达的监视、地球观测和监控。过去&#xff0c;收发机的系统工程师在这些应用中使用中频架构。现在&#xff0c;高速数据转换器的最新发展&#xff0c;使新型基于射频直接采…

gif怎么转换成mp4格式?

gif怎么转换成mp4格式&#xff1f;GIF动态图片是一种常见的图片文件&#xff0c;平时我们聊天时会使用到表情包、广告宣传场景也会使用到gif动图&#xff0c;而MP4则是目前广泛应用的视频格式&#xff0c;相信大家都知道这一点。将GIF图片转换为视频格式是一种非常实用的方法。…

SpringCloud实用篇02

文章目录 SpringCloud实用篇020.学习目标1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09…

选择无论文答辩硕士,那只能选择免联考双证中国人民大学与加拿大女王大学金融硕士

硕士的论文和答辩是一种检验硕士阶段的学习研究成果的一种方式&#xff0c;通过答辩可以让老师清楚的了解论文的价值所在。但从选题背景、研究意义到研究思路、理论基础、研究方法再到关键技术点、实践难点等等&#xff0c;这一个复杂的过程让很多考生在最后这一关被淘汰出局。…

咚咚咚,穷人版生产力工具,好用到飞起

每个程序员都有自己的生产力工具&#xff0c;不管你是深耕职场多年的老鸟&#xff0c;还是在学校努力学习的小鸟&#xff0c;应该都有自己囊里私藏的好辅助。比如帮你完成从头脑风暴草图到创建线框图/原型的UI工具&#xff0c;让代码规范和交付更为可靠的版本控制工具等等。 今…

23种设计模式的必备结构图

这里总结了23种设计模式的结构图及定义&#xff0c;样例代码在 Github&#xff1a;studeyang/design-pattern。 一、创建型模式 1.1 简单工厂模式 1.2 工厂方法模式 工厂方法模式&#xff0c;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一…

metaRTC6.0 janus推流操作指南

概要 Janus 是一个非常有名的 WebRTC 流媒体服务器&#xff0c;它是以 Linux 风格编写的服务程序&#xff0c;采用 C 语言实现,Janus 提供插件机制来支持不同的业务逻辑&#xff0c;配合官方自带插件就可以用来实现高效的webRTC Server服务。 metaRTC6.0新版本支持向janus推流…

【国内某组态软件和plc的通信漏洞挖掘】

因为已从原单位离职&#xff0c;复现的环境也已经丢失&#xff0c;再加上也没怎么提交过漏洞&#xff0c;导致上传cnvd失败&#xff0c;故发在此处&#xff0c;万一有用的话&#xff0c;有缘人可自行提交漏洞库。 &#xff08;一&#xff09; 环境 组态软件IP地址&#xff1a…

freemark模板导出word-01-简单文本内容

在一些项目中&#xff0c;会遇到导出固定格式的word文档&#xff0c;这个时候我们可以使用模板freemarker来实现&#xff0c;本文先分享简单的字符串填充。 比如现在有一个word模板的样式如下 我们填充好内容后(重点坑点&#xff1a;先采用记事本类似的将${A1}编辑好&#xff…

简易画笔效果

使用代码创建纯白图片&#xff0c;图片大小要与image组件大小相同 使用OnDrag触摸的时候将触摸点周围的像素都改为透明 使用shader判断两张图&#xff0c;只要有一张图像素点透明的地方就都透明 shader代码 Shader "Hidden/Draw" {Properties{_MainTex ("Textu…

少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(判断题)2023年3月

2023年3月scratch编程等级考试二级真题 判断题(共10题,每题2分,共20分) 26、执行完这段程序后,可以在舞台上画出一个正方形 答案:错 考点分析:考查积木综合使用,重点考查画笔积木的使用,从程序中可以看出落笔是在最后,所以在落笔之前绘制的图形是不会显示出来,没…

机器学习服务语音合成,解锁智能养娃新趋势

从翻阅图书绘本到捧着电子书&#xff0c;再到点开手机里的音频APP&#xff0c;随着“互联网阅读”的逐步深入&#xff0c;儿童有声读物越来越受95后父母的欢迎&#xff0c;它的出现令年轻父母摆脱了为孩子讲故事的辛苦&#xff0c;而且有声读物配音发音更加标准&#xff0c;有助…

每日学术速递5.15

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Not All Languages Are Created Equal in LLMs: Improving Multilingual Capability by Cross-Lingual-Thought Prompting 标题&#xff1a;并非所有语言在 LLM 中都是平等的&#…

直流电机 PID 控制系统仿真研究(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

openGauss数据库3.0.0升级5.0.0操作实践

文章目录 1.1 前言1.2 升级须知升级流程升级方式升级约束 1.3 升级前准备1.4 升级操作1.5 升级验证1.6 提交升级 1.1 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。之前基于3.0.0版本进行了一些实践&#xff0c;本篇就详细介绍如何将o…

Win7/Win10/Win11系统怎么显示文件后缀

在不同版本的Windows系统中&#xff0c;如Win7/Win10/Win11&#xff0c;显示文件的后缀名可能会有所不同。为了方便用户在进行文件管理时更加方便和高效&#xff0c;本文整理了Win7/Win10/Win11系统中显示文件后缀的具体方法&#xff0c;希望能帮助大家更加轻松地管理自己的文件…

展会进行时!5月16-18日箱讯与您相约中国航交会

宁波国际会展中心7、8号馆 第五届中国&#xff08;宁波&#xff09;国际航运物流交易会 暨2023全球物流企业合作博览会 火爆进行中 箱讯与您相约 8号馆 C033K-C036展位 期待您的光临&#xff01; 2023年5月16-18日&#xff0c;第五届中国&#xff08;宁波&#xff09;国际…