SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)
目录
一、Sentinel 与 Gateway 的限流有什么差别?
1.1、前置知识 - 四种常见的限流算法
1.1.1、Tips
1.1.2、计数器算法
1)固定窗口计数器算法
2)滑动窗口计数器算法
1.1.3、令牌桶算法
1.1.4、漏桶算法
1.2、解决问题
一、Sentinel 与 Gateway 的限流有什么差别?
1.1、前置知识 - 四种常见的限流算法
1.1.1、Tips
限流,就是指对服务器请求量做限制,避免因为突发的请求量过多,导致服务器宕机.
比如,我们的服务器只能抗住每秒 1000 的请求量,但此时突然有 10000 的请求量来了,那么就需要把你这么大的请求量拦下来,按照服务能够承载的流量去放行,起到一个流控的效果.
如何实现呢,就来看看这主流的三种限流算法~
1.1.2、计数器算法
计数器算法又包括两种算法,如下:
1)固定窗口计数器算法
a)首先,他会将时间划分成多个窗口(时间窗口也被称为 interval),然后呢每一个窗口都会维护一个计数器,一旦有一个请求在这个窗口出现,计数器就会加一.
b)随着这一时刻突然增多,那么这个计数器就会越来越大,所以限流就是在设置这个计数器的阈值,数量超过阈值的请求就会被丢弃.
例如,窗口大小是 1000ms,阈值是3. 那么如果这 1000 ms 内的请求来了 4 个,那么超过阈值的那一个请求就会被丢弃.
这种算法会有一点缺陷:
例如,窗口大小是 1000ms,阈值是3. 我在 4000ms ~ 4500ms 之间一个请求都没有,然后在 4500ms ~ 5000ms 之间来了三个请求,你看,这是没问题的吧...
接着在 5000ms ~ 5500ms 之间又来了三个请求,并且 5500ms ~ 6000ms 之间也没有请求来,那么这一看,我这个窗口里也没超过呀.
但是!仔细思考一下,4500ms ~ 5500ms 之间不也是 1s 么,等于说你这 1s 放行了 6 个请求,如果你系统的最大 qps 是 3(每秒最多处理 3 个),岂不是就搞崩了.
如下图:
那么为了解决上述问题,就有了滑动窗口计数器算法~
2)滑动窗口计数器算法
a)滑动窗口计数算法中,不光有窗口,还会把窗口划分成更小的时区,例如窗口大小是 1000ms,分区比如是 2,那么就会把 1s 按照两个区间来划分,每个小的区间大小就是 500ms,这个区间就是用来统计请求个数的
b)真正的窗口呢,我们还是按照 1s 来统计(qps 的意义就是每秒请求量).
c)窗口也是会移动的,移动的方式由当前时间来决定窗口的范围,就是用当前请求到达的时间 减 时间窗口(interval)之后的第一个时区算起.
例如,时间窗口大小是 1000ms,分区是 500ms,qps 是 3. 假设有三个请求,分别是 900ms、 1250ms、1300 ms,此时计算窗口大小就是 1300ms ~ 1300ms - 1000ms 的下一个时区,也就是 500 ~ 1500ms,一共有三个请求. 如果400ms 又来了一个请求,是不是按照滑动窗口的计算方式就超出了,因此就会抛弃掉.
但是如果按照固定窗口大小计算,就有可能正好在 500 ~ 1500ms 这个区间也是一秒,因此就会放行通过,那这就相当于多放行了一个请求!
那么滑动窗口就一定没问题么?
不一定哦,假设 1600ms 这个时候又来了一个请求,就要出问题了!乍一看,窗口区间是 1600ms ~ 1600ms - 1000ms 的下一个时区,也就是 1600ms ~ 1000ms,只放行了三个请求.
但是仔细看一下,1600ms 和 900ms 的这个请求之间差多少秒?是不是 700ms,也就是说,这700ms 的时间,连续放行了 4 个请求!
因此,滑动窗口知识解决了固定窗口的小问题,而如果几个请求之在窗口之间挨的很近,依然会出问题. 这个时候,你就可以把这个时区再继续分的更细一点,就能解决了. 例如 时区大小是 250ms,那么窗口区间就是 1600ms ~ 750ms,而此时一看窗口里面有 4 个请求,就会把最后来的请求给抛弃了~
如下图:
1.1.3、令牌桶算法
a)令牌桶算法就说,有一个桶,这个桶里会以固定的速率去生成令牌(这个速率实际上就是 qps).
b)当这个桶满了以后,就会把多余的令牌丢弃.
c)每一个请求来的时候都会去申请一个令牌,如果桶中没有令牌,请求就会被丢弃.
例如,qps 是5,也就是生成 令牌的速率是每秒 5 个,而此时桶中有 5 个令牌,但是忽然有 6 个请求同时到来,那么多出来的请求就会被丢掉.
令牌桶算法的缺陷:
思考这样一个问题,假设桶的容量是 5,每秒生成 5 个令牌,但非常神奇的是,第一秒的时候一个请求都没有来,而第二秒突然来了 10 个请求,那么首先会先去桶里把存的 5 个令牌拿走,这 5 个请求瞬间就过去了,而第二秒的时候又要生成 5 个令牌,剩下的 5 个令牌是不是也能过去.
这就超过阈值了...
他的缺陷同时也是一个好处:
如果我们设置令牌的速度不是我们服务器的上限,而是一个平均值,偶尔超出也不会把服务压垮,那么令牌桶就可以很好的处理突发的请求情况(请求带有波动性的).
例如服务器的最大并发能力是 6,我设置 qps 为 3(令牌生成速度),如果说第一秒没有请求来,那么第二秒的时候来了 6 个请求,此时就可以桶里有 6 个令牌,就都能都放行处理了,不会造成请求的丢失.
令牌桶的真正底层实现:
虽然我们讲他是利用一个桶,每秒钟生成多少令牌,但是代码真正的实现可不是这样,因为你还要弄个定时器去生成,很麻烦.
令牌桶的代码实现思路是这样的:
- 这个桶的话实际上里面并不会生成令牌,而是记录上一个请求来的时间,另外还记录了当前还有几个令牌了.
- 只要记录了这两样东西,那么当请求来了以后,我只需要计算这个请求和上一个请求之间的时间差,如果时间差在小于令牌在这段时间生成的数量,就可以放行通过
例如我每秒生成 5 个令牌,那么假设来了两个请求,我就可以计算以下他两的时间差,比如说是 0.2 秒,那么当前的令牌个数就可以认为是 0.2 * 5 = 1,因此此时只有一个令牌,只能处理一个请求,处理不了这第二个.
1.1.4、漏桶算法
a)漏桶算法呢也有一个桶,只不过不是用来存令牌的,而是用来存请求的.
b)当请求来了,就会把它当成一滴水放到桶里面去,然后漏桶就会以固定的速率向漏出请求.
c)如果桶满了,多余的请求就会被丢弃.
这就像是有一个桶,但是桶下面开了一个小口,当你往桶里倒水的时候,水就会以固定的速率从这个固定大小的小口流出.
漏桶算法的优势:
- 应对突发的请求:假如漏桶的处理速度是每 3s 一个请求,但是如果突发来了 10 个请求,没关系,我在桶里先存起来,后面慢慢处理就可以.
- 流量永远是平滑的:不管你每秒是来了 10 个还是 100 个请求,只要我桶够大,那么放出去的速度永远都是固定的,也就是说他处理请求的速度一直是一条直线.
- 对比令牌桶:对于令牌桶来说,如果请求忽高忽低,这个时候令牌桶就没办法保证平滑,他有可能会出现忽高忽低的情况,因为前一秒令牌没有用完可以累计,在下一秒就有可能出现一次性被消耗完的情况.
漏桶算法的实现原理:
a)漏桶算法的请求实际上就是遵循先进先出,那么用的容器肯定就是队列.
b)当请求来的时候,这些请求就会按照时间间隔依次执行.
c)并且会有一个预期等待时间,实际上就是桶的大小. 当新的请求到来时,就会将桶中所有请求的等待时间加起来,然后再加上新的请求,如果大于预期等待时间,这个新的请求就会被抛弃.
例如,桶的预期等待时间是 2000ms(桶的大小),qps 是 5(每秒通过 5 个请求),也就相当于 200ms 处理一个请求.
突然某一时刻同时来了很多请求,那么第一个请求进来时,可以立即被执行,因此等待时间就是 0ms,第二请求就需要排队了,就是 200ms 的时候会被执行,往后以此类推. 当队列中所有请求的等待时间加起来等于 2000ms 的时候(预期等待时间),此时再来的请求就会被拒绝.
1.2、解决问题
明白上述的四种算法,回答这个问题就游刃有余了~
这个时候你就可以说,那么首先呢常见的有 3 种限流算法,分别是 计数器算法、令牌桶算法、漏桶算法. Gateway 采用的是基于 Redis 实现的令牌桶算法(key value 就是一个桶).
而 Sentinel 内部实现的比较复杂:
- 默认限流模式是基于滑动时间窗口算法
- 排队等待的限流模式则基于漏桶算法:因为漏桶算法本身就是一种排队嘛,请求来了,如果前面还有请求没被执行,就排队,并且按照固定的频率去执行.
- 而热点参数限流则是基于令牌桶算法:热点参数的特点就是针对每个一个参数单独去统计,那么你可以看作是一个接口,比如查询商品,将来商品的参数可能就是成千上万,如果采用滑动窗口的方式,那就需要进行时间分区,并每个分区种都有一个计数器来统计,那么对内存的消耗是非常大的. 如果使用令牌桶,就只需要记住这个参数对应的令牌即可(上一个请求来的时间).
相关文章:

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)
目录 一、Sentinel 与 Gateway 的限流有什么差别? 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1)固定窗口计数器算法 2)滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…...
邦芒忠告:职场新人最需要避开的十大雷坑
职场人最害怕的就是踩雷进坑,很多新入职场的小白都会战战兢兢,生怕哪里不对,冒犯了哪一位,或者触犯了哪一条潜规则。害怕自己踩到雷,没有走好职场第一步。最近,单位进了几个新人,看到他们就想起…...

MySQL-进阶-索引
一、索引概述 1、介绍 2、有误索引搜索效率演示 3、优缺点 二、索引结构 1、B-Tree(多路平衡查找树) 2、BTree 3、Hash 三、索引分类 四、索引语法 1、语法 2、案例 五、SQL性能分析 1、查看执行频次 2、慢查询日志 3、show-profile 4、explain...

GitLab入门指南:上传与下载操作一网打尽
GitLab简介: GitLab是一个基于Git的开源仓库管理系统,提供了一个Web界面的Git存储库管理器,并集成了多种开发工具的功能,如代码审查、问题跟踪、持续集成和持续部署等。GitLab可以在本地服务器上部署,也可以使用其提供…...

GPT应用_PrivateGPT
项目地址:https://github.com/imartinez/privateGPT 1 功能 1.1 整体功能,想解决什么问题 搭建完整的 RAG 系统,与 FastGPT 相比,界面比较简单。但是底层支持比较丰富,可用于知识库的完全本地部署,包含大…...
Qt‘s 撤销框架(Qt‘s Undo Framework)
一、开篇序言 我们常常有这样的业务场景,需要支持撤回的动作(即 undo)。如果让你来设计,聪明的你肯定也能立即想到解决问题的办法,对,将操作的 command { 对象,指令,属性 } 保存到一个容器中。 如果是仅需要单步撤销, 使用栈容器 保存command,动作执行即指令入栈, …...

【C++】stack、queue的使用及模拟实现
目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 一、stack 1.1 stack的使用 stack是一种容器适配器,它的特点是后进先出,只能在容器的一端进行插入和删除操作。 stack的使用很简单,主要有…...

外包干了2个多月,技术退步明显。。。。。
先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

html5实现好看的年会邀请函源码模板
文章目录 1.设计来源1.1 邀请函主界面1.2 诚挚邀请界面1.3 关于我们界面1.4 董事长致词界面1.5 公司合作方界面1.6 活动流程界面1.7 加盟支持界面1.8 加盟流程界面1.9 加盟申请界面1.10 活动信息界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者:xcLei…...

【C++】反向迭代器模拟实现
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.利用适配器的思想…...

【低照度图像增强系列(5)】Zero-DCE算法详解与代码实现(CVPR 2020)
前言 ☀️ 在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。 🌻使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标…...
三维重建衡量指标记录
1、完整性比率 Completeness Rati (CR) 完整性比率 完整性比率是用于评估三维重建质量的指标之一,它衡量了重建结果中包含的真实物体表面或点云的百分比。完整性比率通常是通过比较重建结果中的点云或三维模型与真实或标准点云或模型之间的重叠来计算的。 具体计算…...

在WinForms中控制模态对话框的关闭行为
博客文章:在WinForms中控制模态对话框的关闭行为 引言 在Windows Forms (WinForms) 应用程序中,对话框的行为控制是提升用户体验的关键部分。特别是在使用模态对话框时,防止用户不经意间关闭它变得尤为重要。本文将探讨如何通过重写 FormClo…...

java web mvc-02-struts2
拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails Struts2 Apache Struts是一个用于创…...

文件上传之大文件分块上传
分久必合,合久必分 优势部分:减少了内存占用,可实现断点续传,并发处理,利用带宽,提高效率 不足之处:增加复杂性,增加额外计算存储 应用场景:云存储大文件上传、多媒体平台…...

测试用例评审流程
1:评审的过程 A:开始前做好如下准备 1、确定需要评审的原因 2、确定进行评审的时机 3、确定参与评审人员 4、明确评审的内容 5、确定评审结束标准 6、提前至少一天将需要评审的内容以邮件的形式发送给评审会议相关人员。并注明详审时间、地点及偿参与人员等。 7、 在邮件中提醒…...

鸿蒙开发案列一
1、开发需求 案例app一打开是“Hello world” 界面,开发者点击“Hello world”变成“Hello ArkUI”’ 2、源代码 Entry Component struct Hello {State person_name: string Worldbuild() {Row() {Column() {Text(Hello this.person_name).fontSize(50).fontWei…...

Vue实现图片预览,侧边栏懒加载,不用任何插件,简单好用
实现样式 需求 实现PDF上传预览,并且不能下载 第一次实现:用vue-pdf,将上传的文件用base64传给前端展示 问题: 水印第一次加载有后面又没有了。当上传大的pdf文件后,前端获取和渲染又长又慢,甚至不能用 修…...

Spring依赖注入之setter注入与构造器注入以及applicationContext.xml配置文件特殊值处理
依赖注入之setter注入 在管理bean对象的组件的时候同时给他赋值,就是setter注入,通过setter注入,可以将某些依赖项标记为可选的,因为它们不是在构造对象时立即需要的。这种方式可以减少构造函数的参数数量,使得类的构…...

碳排放预测 | Matlab实现LSTM多输入单输出未来碳排放预测,预测新数据
碳排放预测 | Matlab实现LSTM多输入单输出未来碳排放预测,预测新数据 目录 碳排放预测 | Matlab实现LSTM多输入单输出未来碳排放预测,预测新数据预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现LSTM长短期记忆神经网络多输入单输出未来…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...