sentinel---滑动窗口的实现原理

sentinel有多种规则,包括:降级、限流、热点等等规则,这些规则均会涉及到时间因素,既在单位时间内的请求量满足各种条件之后的各种动作。

这里我们一起来探针一下sentinel中滑动窗口的实现

 如上是一个滑动窗口的示意图。

这里先不说sentinel中滑动窗口的实现代码,咱们想清楚一个问题,为后续阅读滑动窗口代码梳理清楚思路

 使用滑动窗口来解决什么问题?

我们使用滑动窗口是为了:统计在一个时间单位里面的数据

要统计一各时间单位,就涉及到时间单位的定义(是1秒还是100ms),统计数据,就需要一个容器来装载数据,同时为了避免在某个时间节点的数据激增,减少统计的误差,可能还需要把一个"单位时间"做更小的切分

涉及的类

com.alibaba.csp.sentinel.slots.statistic.base.LeapArray

LeapArray是sentinel中滑动时间窗口的基类,首先看下该类的类定义:

 涉及到3个基本属性和一个引用类型

其中:windowLengthInMs、sampleCount、intervalInMs和我们上面说的单位时间和单位时间的切割有关系,array是用来存放数据的,既:单位时间内的数据存放容器

其中WindowWrap顾名思意:就是时间窗口数据的包装类

LeapArray的构造器:

 看完如上两段之后,我们做如下假设:需要统计在1000ms内的数据,假设我们把1000ms这个单位时间分成两段,每段500ms,每段的数据存储在一个windowWrapper中

那当某个时间点,我们有个数据需要存储时:

1  需要计算出该时间节点属于哪个时间窗口(2个500ms的段)

2  需要计算出该时间节点的对应的是哪个windowWrap

以下两个方法就可以解决如上两个问题: 

试想以下:当时间节点来到1001时:此时计算出来的start位置(calculateWindowStart方法计算结果)就是:1000,1002计算出的起始位置也是:1000。同时1001和1002计算出来数据落在数组的位置(calculateTimeIdx的结果)也是一样的,均是:0

由此不难看出,如上2个方法把我们需要的关键数据已经计算出来了:时间窗口的开始位置(因为窗口长度一样,结束位置肯定也是一样的),时间窗口对应的容器

所以,如果我们要获取当前时间节点的数据和在当前时间节点添加数据的计算方法:

首先,计算出两个关键数据:容器下标:idx,时间窗口起始位置:windowStart

 当从数据中去那容器数据时为空,创建新容器,存入数组。当然这里涉及到乐观锁的运用

 当不为空,且当前时间和老容器的其实位置相同时:该事件节点和之前某次操作的时间差在500ms以内,使用同一个容器存储数据

 如果当前时间节点比上次操作的时间节点超过了500ms(甚至更久),修改容器中的时间起始位置,重置容器的数据(涉及悲观锁的运用)

以上就是sentinel的滑动时间窗口的核心逻辑

当我们需要统计当前时间节点所在的1个单位时间内的数据时:

 

也就是:当我们需要获取当前时间节点的数据时:直接读取数组中的数据,如果数组中的数据windowWrap的时间起点和当前时间的时间起点不超过intervalInMs(在一个时间单位中),就取出

当需要往容器中添加数据时:我们在LeayArray的子类(OccupiableBucketLeapArray)找到了实现:

以上就是:sentinel的滑动时间窗口的实现核心逻辑

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法学习】高级班九

这种互为旋变串&#xff1a; 给定两个字符串&#xff0c;判断是否互为旋变串 代码&#xff1a; 打表法&#xff1a; 每一层内的数字不互相依赖&#xff0c;只依赖它下面的层但实际上size会约束L1和L2的值&#xff0c;即L1和L2<N-size 思路&#xff1a;设置一个窗口…

B057-spring增强 依赖注入 AOP 代理模式 创建Bean

目录 AOP概念代理模式引出AOP实现方式xml方式实现注解方式实现 AOP 概念 事务管理&#xff1a;比如可以抽取try catch的重复代码 日志监控&#xff1a;比如业务逻辑前后打印关于当前订单数量的日志&#xff0c;了解业务做了什么 性能监控&#xff1a;比如业务前后打印时间&…

MySQL中基础查询语句

用户表user数据如下&#xff1a; iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543famale20北京大学Deijing42315female 23 浙江大学ZheJiang55432male25山东大学Shandong 1&#xff0c;写出ddl语句创建如上表&#xff0c;…

buuctf crypto刷题1

目录 (1) 凯撒&#xff1f;替换&#xff1f;呵呵!(替换密码爆破) (2) RSA1(dp泄露) (3) RSA2(dp泄露大整数分解) (4) RSA3(共模攻击) (5) 还原大师(md5爆破) (6) RSA(公钥文件解析) (7) RsaRoll (8) Dangerous RSA(小明文攻击) (9) [GUET-CTF2019]BabyRSA (10) [BJD…

在Vue中动态引入图片为什么要用require

静态资源和动态资源 静态资源 动态的添加src 动态资源 我们通过网络请求从后端获取的资源 动态的添加src会被当成静态资源 动态的添加src最终会被打包成&#xff1a; 动态的添加图片最会会被编译成一个静态的字符串&#xff0c;然后再浏览器运行中会去项目中查找这个资源…

数据库--MySQL

一、什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足…

操作系统搭建相关知识

系统篇 systemctl命令 常用于重启系统的每个服务&#xff0c;例如重启系统的网络&#xff0c;使用restart参数!!! 网络篇 ifconfig命令 注意&#xff1a;如果有过多块网卡&#xff0c;例如&#xff1a;eth0和eth1网卡&#xff0c;一般查看那个参数上面带有RUNNING和UP网卡开…

TFRecords详解

内容目录 TFRecords 是什么序列化(Serialization)tf.data 图像序列化&#xff08;Serializing Images)tf.Example函数封装 小结 TFRecords 是什么 TPU拥有八个核心&#xff0c;充当八个独立的工作单元。我们可以通过将数据集分成多个文件或分片&#xff08;shards&#xff09;…

Flutter父宽度自适应子控件的宽度

需求&#xff1a; 控件随着金币进行自适应宽度 image.png 步骤&#xff1a; 1、Container不设置宽度&#xff0c;需要设置约束padding&#xff1b; 2、文本使用Flexible形式&#xff1b; Container(height: 24.dp,padding: EdgeInsetsDirectional.only(start: 8.dp, end: 5.d…

文档控件DevExpress Office File API v23.1新版亮点 - 支持.NET MAUI

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

web后端解决跨域问题

目录 什么是跨域问题 为什么限制访问 解决 什么是跨域问题 域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做&#xff0c;它是由浏览器的同源策略造成的&#xff0c;是浏览器对js施加的安全…

springboot文件上传和下载接口的简单思路

springboot文件上传和下载的简单思路 文件上传文件下载 文件上传 在springboot中&#xff0c;上传文件只需要在接口中通过 MultipartFile 对象来获取前端传递的数据&#xff0c;然后将数据存储&#xff0c;并且返回一个对外访问路径即可。一般对于上传文件的文件名&#xff0c…