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

news2024/11/26 19:39:09

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

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

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

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

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

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

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

涉及的类

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

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

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

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

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

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.coloradmin.cn/o/847813.html

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

相关文章

电脑IP地址错误无法上网怎么办?

电脑出现IP地址错误后就将无法连接网络,从而无法正常访问互联网。那么当电脑出现IP地址错误时该怎么办呢? 确认是否禁用本地连接 你需要先确定是否禁用了本地网络连接,如果发现禁用,则将其启用即可。 启用方法:点击桌…

设计实现数据库表扩展的7种方式

设计实现数据库表扩展的7种方式 在软件开发过程中,数据库是一项关键技术,用于存储、管理和检索数据。数据库表设计是构建健壮数据库系统的核心环节之一。然而,随着业务需求的不断演变和扩展,数据库表中的字段扩展变得至关重要。 …

【TensorFlow】P0 Windows GPU 安装 TensorFlow、CUDA Toolkit、cuDNN

Windows 安装 TensorFlow、CUDA Toolkit、cuDNN 整体流程概述TensorFlow 与 CUDA ToolkitTensorFlow 是一个基于数据流图的深度学习框架CUDA 充分利用 NIVIDIA GPU 的计算能力CUDA Toolkit cuDNN 安装详细流程整理流程一:安装 CUDA Toolkit步骤一:获取CU…

GIS和倾斜摄影的关系?

GIS(地理信息系统)和倾斜摄影是两种在地理空间数据处理和分析中扮演重要角色的技术。但是我们总是会分不清二者,本文就带大家从不同角度了解二者之间的关系。 概念 GIS是一种用来捕获、存储、分析和展示地理空间数据的技术,它可以…

Java课题笔记~ Spring 集成 MyBatis

Spring 集成 MyBatis 将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以该整合,只需要将 SqlSessionFactory 的对象生成器SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao…

Apollo让自动驾驶如此简单

前言: 最近被新能源的电价闹的不行,买了电车的直呼上当了、不香了。但电车吸引人不只是公里油耗低,还有良好的驾车使用感。比如辅助驾驶、甚至是自动驾驶。今天来介绍一个头部自动驾驶平台Apollo,Apollo是一个开源的、自动驾驶的软…

【Hystrix技术指南】(4)故障切换的运作流程

[每日一句] 也许你度过了很糟糕的一天,但这并不代表你会因此度过糟糕的一生。 [背景介绍] 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被使…

iperf3-性能测试

iperf3-性能测试 安装1.apt安装2.源码安装 使用方法iperf原理测试参考文档性能测试客户端服务端 官方文档:https://iperf.fr/iperf-doc.php 安装 1.apt安装 sudo apt-get install iperf32.源码安装 # 按照官方说明安装 ./configure make sudo make install执行编…

OceanBase 4.1.0 clog 目录探究

基于OceanBase 4.x 版本如何统计租户每日 clog 日志生成量的背景下,探究以及如何查看租户 clog 的使用情况。 作者:姜宇 爱可生 DBA 团队成员,擅长数据库故障排查和处理。对技术抱有热忱,实践是检验真理的唯一标准~ 本文来源&…

对docker的简单理解

一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发运维之间的协作,我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的…

MySQL安装和卸载

1.MySQL概述 MySQL概述 MySQL是一个[关系型数据库管理系统],由瑞典MySQL AB 公司开发,2008年被sun公司收购, 2009sun又被oracle收购,所以属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用…

springboot(4)

AOP 1.AOP与OOP OOP(Object Oriented Programming,面向对象编程) AOP(Aspect Oriented Programming,面向切面编程) POP(Process Oriented Programming,面向过程编程) …

扩展卡尔曼滤波器代码

文章目录 前言问题状态向量和观测向量加性噪声的形式状态方程及求导观测方程及求导状态初始化过程噪声和观测噪声卡尔曼滤波过程code 前言 卡尔曼滤波器在1960年被卡尔曼发明之后,被广泛应用在动态系统预测。在自动驾驶、机器人、AR领域等应用广泛。卡尔曼滤波器使…

在R中比较两个矩阵是否相等

目录 方法一:使用all.equal()比较两个R对象是否近似相等 方法二:使用identical比较两个R对象是否精确相等。 方法一:使用all.equal()比较两个R对象是否近似相等 使用函数:all.equal(x,y) 比较两个R对象x和y是否近似相等 > M1…

抽象工厂模式(C++)

定义 提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。 使用场景 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种…

Java实现微信公众号自定义回复

第一版实现微信公众号自动回复: ● 实现自定义回复内容的管理,将关键词、半匹配、以及关注、默认回复等刷新到缓存中 ● 用户发送消息进行匹配后通过微信回复格式直接返回,如果内容存在文字和图片,文字通过xml格式直接返回&…

每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)

今日份题目: 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 示例1 输入:s "abaccdeff" 输出:b 示例2 输入:s "" 输出: 提示 0 …

RocketMQ学习一入门使用

从0开始学习RocketMQ,这一节主要是windows下环境部署,以及我理解的基本使用流程。 安装 1.下载地址:下载 | RocketMQ 注意,如果是windows环境下需要下载的是二进制文件,也就是这一列。 2.下载后解压到自己想要的目录…

从零开始学习查询京东快递并查询超时状态的小技巧

随着电子商务的蓬勃发展,快递成为了我们日常生活中不可或缺的一部分。而在众多快递公司中,京东快递以其高效、可靠的服务赢得了广大用户的青睐。然而,查询京东快递并同时查询快递的超时状态却一直是用户们头痛的问题。今天,我将为…

学习笔记|LED点亮原理|三极管在数字电路中的应用|Keil中的Tab设置|C51中对准双向口|STC32G单片机视频开发教程(冲哥)|第四集-上:点亮LED

文章目录 1.LED点亮原理STC32G12K128LQFP64QFN64管脚图:Tips:USB-ISP下载程GPIO (general purpose intput output)Tips:三极管在数字电路中的应用 2 新建工程Tips:Tab设置11.2 配置IO口注意: Tips:C51中对准双向口的解…