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长短期记忆神经网络多输入单输出未来…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
