Sentinel如何使用滑动窗口进行限流和降级,请看这篇文章分享

news2024/11/26 14:32:50

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍如何Sentinel如何使用滑动窗口进行限流和降级,后续文章将详细介绍其他知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞

在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

在这里插入图片描述

以下正文开始

文章目录

  • Sentinel滑动窗口前言
  • Sentinel滑动窗口原理
  • 如何在项目中使用滑动窗口

在这里插入图片描述

Sentinel滑动窗口前言

Sentinel 是一个开源的高可用性、高扩展性的实时流量控制框架,它可以用于保护服务稳定性,防止系统因为流量过大而崩溃。今天我们所介绍的,是滑动窗口,它是 Sentinel 实现限流和降级的重要组件之一。

Sentinel滑动窗口原理

滑动窗口通常由一个固定大小的时间窗口和一个可滑动的数据结构组成,例如队列或滑动块。在 Sentinel 中,滑动窗口被分为计数器类型和预算类型

计数器滑动窗口:计数器滑动窗口维护一个周期内请求的总数,当周期结束后,滑动窗口会被清空,开始下一个周期的计数。在 Sentinel 中,计数器滑动窗口通过 AtomicLong 数组实现,数组的长度代表时间窗口的大小,每个元素代表该时间片保存的请求次数。

预算滑动窗口:预算滑动窗口维护周期内预算资源的使用情况,以便根据实际资源需要进行限流或降级。预算类型的滑动窗口可以设置阈值,并支持动态调整。在 Sentinel 中,预算滑动窗口通常用于 CPU 使用率、线程池等容量资源的控制

除此之外,Sentinel 还提供了基于单机、集群和分布式三种模式的滑动窗口实现。其中,单机模式下将使用本地内存来维护滑动窗口数据结构;集群模式下,各节点会通过多播或 Redis 等方式共享相同的计数器数据;分布式模式下,则允许多个服务节点公用同一组滑动窗口数据。

在使用 Sentinel 进行限流和降级时,用户可以通过配置规则来指定需要监控的目标资源,并设置相应的阈值和处理策略。例如,在限流场景下,用户可以设置最大 QPS,并指定超过该阈值的请求将会被丢弃或返回特定的错误码。在降级场景下,用户可以设置响应时间、异常比例等阈值,并指定相应的降级策略,例如返回默认值或者直接抛出异常。

如何在项目中使用滑动窗口

以实际的项目为例子,我们有一个服务用于提供用户信息查询接口,每秒钟最多只能处理 10 次查询请求,并且如果连续 5 秒内的请求次数超过 50 次,则触发限流或降级操作

在 Sentinel 中,我们首先需要定义一个 FlowRule 数组用于配置针对该服务的限流规则,在这块项目例子中,它们是每秒钟限流到 10 个请求和 5 秒内超过 50 次请求两种限制:

FlowRule rule1 = new FlowRule();
rule1.setResource("queryUser");
rule1.setCount(10);
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);

FlowRule rule2 = new FlowRule();
rule2.setResource("queryUser");
rule2.setCount(50);
rule2.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule2.setStrategy(RuleConstant.STRATEGY_CHAIN);
rule2.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);

我们先对以上代码进行解释,“queryUser” 代表资源名称,这个可以自己定义,然后设置了resource、count、grade以及对于第二个规则还增加了三个属性stratety, controlBehavior和controlBehavior。其中 count 表示限流阈值,即每秒钟最多可以处理多少个请求;grade 表示限流模式,QPS(每秒钟最多允许通过的请求数量);strategy 表示限流策略;controlBehavior 表示流量控制的行为。

接下来,我们需要通过执行如下代码初始化 Sentinel:

List<FlowRule> rules = new ArrayList<>();
rules.add(rule1);
rules.add(rule2);
FlowRuleManager.loadRules(rules);

我们这里定义了一个 FlowRule 数组,将前面定义好的两个规则加入到列表中,然后通过 FlowRuleManager.loadRules() 方法加载这些规则。

现在,我们可以在查询用户信息的方法上增加 @SentinelResource 注解,并在该注解中设置 blockHandler 和 fallback 属性来处理限流和降级异常:

@SentinelResource(value = "queryUser", blockHandler = "queryUserBlockHandler",
    fallback = "queryUserFallback")
public UserInfo queryUser(String userId) {
    // 查找用户信息的实现
}

// 限流/降级处理函数
public UserInfo queryUserBlockHandler(String userId, BlockException ex) {
    // 返回具体的错误信息
}

// 降级处理
public UserInfo queryUserFallback(String userId, Throwable ex) {
    // 返回降级后的响应
}

以上代码中我们定义了一个名为“queryUser”的资源,它被 @SentinelResource 注解所修饰,blockHandler 属性表示当该服务触发限流或降级时调用的函数,fallback 属性表示服务出现异常时的回退函数。

最后,我们可以通过对定时任务进行调度,模拟10秒内对同一个 API 请求用户数据的场景,例如代码如下:

public class QueryUserTask implements Runnable {
    private static final Random random = new Random();

    @Override
    public void run() {
        // 模拟 10 秒内对同一个 API 请求用户数据
        for (int i = 0; i < 20; i++) {
            String userId = "user-" + (i % 5);
            queryUser(userId);
            try {
                Thread.sleep(random.nextInt(500));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

我们可以在 QueryUserTask 内部实现每隔一秒获取一次用户信息,检测系统是否触发限流或降级保护。如果触发了规则中配置的限流规则,那么 Sentinel 将执行相应的措施进行处理。

好了,本篇文章就先分享到这里了,后续将会继续介绍sentinel详细的其他方面的知识,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

环境感知算法——3.PSMNet基于Kitti数据集训练

1. 前言 PSMNet的核心思想是通过金字塔结构来捕捉不同尺度的特征信息&#xff0c;从而提高视差估计的精度。其亮点在于&#xff1a;&#xff08;1&#xff09;使用了金字塔形的卷积神经&#xff08;SPP module&#xff09;网络来提取不同尺度的特征信息&#xff1b;&#xff0…

【UR机械臂ros通讯前的示教器网络配置】

1. 前言 欢迎大家阅读2345VOR的博客【D435i深度相机YOLO V5结合实现目标检测】&#x1f973;&#x1f973;&#x1f973;2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&…

《新程序员005:开源深度指南新金融背后的科技力量》

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰来写书评啦&#xff0c;尽管再忙&#xff0c;也不能不读书&#xff0c;下面&#xff0c;就让小雅兰来带你们走进《新程序员005&#xff1a;开源深度指南&新金融背后的科技力量》这本书的世界吧&#xff01;&#…

安科瑞医用隔离电源系统在浙江某医院项目中的应用

【摘要】介绍该三级乙等综合医院采用安科瑞医用隔离电源系统&#xff0c;使用分体配电柜安装方式&#xff0c;从而实现将TN系统转化为IT系统&#xff0c;以及系统绝缘情况监测。 【关键词】医用隔离电源系统&#xff1b;IT系统&#xff1b;绝缘情况监测&#xff1b;三级乙等综合…

华为OD机试真题 Java 实现【最差产品奖】【2023Q1 200分】

一、题目描述 A公司准备对他下面的N个产品评选最差奖,评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。评选的标准是依次找到从当前产品开始前M个产品中最差的产品,请给出最差产品的评分序列。 二、输入描述 第一行,数字M,表示评分…

chatgpt赋能python:用Python编写软件能够带来哪些SEO优势?

用 Python 编写软件能够带来哪些 SEO 优势&#xff1f; Python 是一种高级编程语言&#xff0c;它的简洁性和易学性让 Python 成为现今最受欢迎的编程语言之一&#xff0c;适用于各种类型的编程任务&#xff0c;并且可以轻松地生成各种种类的软件。在构建网站和应用程序时&…

黑马Redis视频教程实战篇(四)

目录 一、秒杀优化 1.1、秒杀优化-异步秒杀思路 1.2、秒杀优化-Redis完成秒杀资格判断 1.3、秒杀优化-基于阻塞队列实现秒杀优化 二、Redis消息队列 2.1、认识消息队列 2.2、基于List实现消息队列 2.3、基于PubSub的消息队列 2.4、基于Stream的消息队列 2.5、基于Str…

【C++初阶】C++STL详解(一)—— string类

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 CSTL详解&#xff08;一…

6.3 SpringBoot日志进阶实战 Logback配置详解

文章目录 前言一、Logback入门级配置二、动态指定属性三、动态指定日志级别四、指定配置文件五、滚动记录RollingFIleAppender六、异步记录AsyncAppender总结最后 前言 在上一篇文章中&#xff0c;我和你介绍了SpringBoot快速入门Slf4j Logback实战&#xff0c;遗留的问题是如…

数据中心末端配电的数字化方案及设备选型

普通PDU和智能PDU有什么区别&#xff1f; 机架安装配电盘或机架配电单元 (PDU) 是一种配备许多插座的设备&#xff0c;可将电力分配给位于数据中心机架或机柜内的服务器、存储设备和网络设备。领先的分析公司 IHS 将它们分为两大类&#xff1a; 1) 基本 PDU 提供可靠的配电。 2…

【2023 · CANN训练营第一季】TIK C++算子开发入门 第一章——TIK C++算子开发入门

1.TIK C介绍 TIK C是一种使用C/C作为前端语言的算子开发工具&#xff0c;通过四层接口抽象、并行编程范式、孪生调试等技术&#xff0c;极大提高算子开发效率&#xff0c;助力AI开发者低成本完成算子开发和模型调优部署 使用TIK C开发自定义算子的优势&#xff1a; (1)C/C原语…

如何编写代码审查文档

一、前言 代码审查(Code Review)是开发流程中非常重要的一个环节&#xff0c;可以帮助发现并改正代码中的错误&#xff0c;提高代码质量&#xff0c;也是共享知识、熟悉代码的好机会。 最近功能开发完毕需要做代码审查&#xff0c;发现国内很多公司不强制要求编写代码审查文档…

【Linux内网穿透】】Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

chatgpt赋能python:Python的就业前景——解析云计算与Python的结合

Python的就业前景——解析云计算与Python的结合 Python是一种高级编程语言&#xff0c;具有高度的可读性和简洁性&#xff0c;并已成为Web和大数据的主流语言之一。Python广泛应用于数据科学&#xff0c;机器学习&#xff0c;Web开发&#xff0c;游戏开发和金融等领域&#xf…

Linux_epoll

Linux_epoll 思考:高效的餐厅服务如何实现?Epoll - Reactor 设计模式Epoll 与 Reactor 设计模式的关系Reactor优点Epoll - IO多路复用的用法web_server示例代码水平触发和边缘触发思考:高效的餐厅服务如何实现? 一个顾客来就餐,一个服务员在顾客点菜期间全程陪同服务! 一个…

并发编程总结

synchronized synchronized有如下3种使用方式 普通同步方法&#xff0c;锁是当前实例对象 静态同步方法&#xff0c;锁是当前类的class对象 同步方法块&#xff0c;锁是括号里面的对象 当一个线程访问同步代码块时&#xff0c;需要获得锁才能执行&#xff0c;当退出或者抛…

chatgpt赋能python:Python修改BIOS:一篇专业的SEO文章

Python修改BIOS&#xff1a;一篇专业的SEO文章 介绍 BIOS&#xff08;Basic Input/Output System&#xff09;是计算机中的核心程序&#xff0c;它负责启动电脑并管理硬件。一旦发现硬件问题&#xff0c;BIOS会通知用户或操作系统。它还可以设置系统的参数&#xff0c;例如时…

Node.js安装教程(npm搭建) - Window

择心】向大家介绍安装Node.js ( npm搭建 ) 一、安装流程 进入Node.js 去下载一个安装包。 双击下载好的应用程序,弹出安装界面并点击Next&#xff0c; 接受协议&#xff0c;点击Next&#xff0c; 更改默认安装路径&#xff0c;点击Next&#xff0c; 会默认添加到Path环境…

【每周一书】--(认知觉醒)思考:如何用清爽的情绪面对内卷的当下?

【每周一书】--&#xff08;认知觉醒&#xff09;思考&#xff1a;如何用清爽的情绪面对内卷的当下&#xff1f; 认知觉醒&#xff1a;开启自我改变的原动力焦虑&#xff1a;焦虑的根源完成焦虑定位焦虑选择焦虑环境焦虑难度焦虑 如何拥有清爽的情绪&#xff0c;释放焦虑情绪 认…

记录使用Pytorch分布式训练(torch.distributed)踩过的坑

引言 最近由于想加速神经网络模型训练&#xff0c;便开始着手学习pytorch的分布式训练&#xff08;DDP&#xff09;&#xff0c;结果踩了很多坑&#xff0c;在这里记录一下&#xff0c;便于以后查看&#xff0c;也同时分享给大家。 教程 我是通过下面几篇博客学习pytorch分布…