首页 > 编程语言 >只需5分钟,了解常见的四种限流算法

只需5分钟,了解常见的四种限流算法

时间:2023-08-20 19:00:48浏览次数:33  
标签:令牌 窗口 请求 算法 限流 速度 四种

一、计数器算法

在指定周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略,当进入下一个时间周期时进行访问次数的清零。如图所示,我们要求3秒内的请求不要超过150次:

但是,貌似看似很“完美”的流量统计方式其实存在一个非常严重的临界问题,即:如果第2到3秒内产生了150次请求,而第3到4秒内产生了150次请求,那么其实在第2秒到第4秒这两秒内,就已经发生了300次请求了,远远大于我们要求的3秒内的请求不要超过150次这个限制,如下图所示:

二、滑动窗口算法

滑动窗口为固定窗口的改良版,解决了固定窗口在窗口切换时会受到两倍于阈值数量的请求,滑动窗口在固定窗口的基础上,将一个窗口分为若干个等份的小窗口,每个小窗口对应不同的时间点,拥有独立的计数器,当请求的时间点大于当前窗口的最大时间点时,则将窗口向前平移一个小窗口(将第一个小窗口的数据舍弃,第二个小窗口变成第一个小窗口,当前请求放在最后一个小窗口),整个窗口的所有请求数相加不能大于阈值。其中,Sentinel就是采用滑动窗口算法来实现限流的。如图所示:

【1】 把3秒钟划分为3个小窗,每个小窗限制请求不能超过50秒。<br> 【2】 比如我们设置,3秒内不能超过150个请求,那么这个窗口就可以容纳3个小窗,并且随着时间推移,往前滑动。每次请求过来后,都要统计滑动窗口内所有小窗的请求总量。

三、令牌桶限流算法(控制令牌生成速度,取的速度不控制)

令牌桶是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。对于每一个请求,都需要从令牌桶中获得一个令牌;如果没有获得令牌,则需要触发限流策略。系统会以恒定速度(r tokens/sec)往固定容量的令牌桶中放入令牌令牌桶有固定的大小,如果令牌桶被填满,则会丢弃令牌

会存在三种情况:

请求速度 大于 令牌生成速度】当令牌被取空后,会被限流<br> 【请求速度 等于 令牌生成速度】流量处于平稳状态<br> 【请求速度 小于 令牌生成速度】请求可被正常处理,桶满则丢弃令牌

如图所示:

四、漏桶限流算法(控制水滴流出速度,不控制水滴产生速度)

主要的作用:

【1】 控制数据注入网络的速度。<br> 【2】 平滑网络上的突发流量。

漏桶限流算法的核心就是:不管上面的水流速度有多块,漏桶水滴的流出速度始终保持不变消息中间件就采用的漏桶限流的思想。如图所示:

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:令牌,窗口,请求,算法,限流,速度,四种
From: https://blog.51cto.com/u_15003301/7163135

相关文章

  • 扩展欧几里得算法
    裴蜀定理对于任意正整数\(a,b\),记\(g=(a,b)\),一定存在整数\(x,y\),使得\(ax+by=g\),且能凑出的数一定是\(g\)的倍数。首先由于\(a,b\)都是\(g\)的倍数,所以能凑出的数必定是\(g\)的倍数。关键在于怎么证明一定存在整数\(x,y\),使得\(ax+by=g\)。下面我们就抛出这个......
  • STL容器和算法
    目录STL容器和算法基本概念容器容器的分类序列式容器关联式容器vector容器vector的定义vector的赋值vector的大小vector的访问方式vector的元素操作deque容器list容器基本概念迭代器基本概念vector的迭代器迭代器失效算法STL容器和算法基本概念标准模板库,主要分为容器、算法、......
  • 算法总结
    前言:有关于算法的一切的大合集基本数据结构及排序方法手撸完全二叉树/满二叉树红黑树节点分为红色或者黑色;根节点必为黑色;叶子节点都为黑色,且为null;连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);从任意节点出发,到其每个叶子节点的路径中包含相同数......
  • 快速幂算法
    快速幂洛谷P1226【模板】快速幂||取余运算#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;llquickpow(lla,llb,llp=10){ //计算a的b次方 if(b==0)return1; intans=1; while(b){ if(b&1){ ans=ans*a%p; } ......
  • 第二十三节 API(算法,lambda,练习)
    常见的七种查找算法:​ 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉有疑惑,可以先看一下哥们后面录制的数据结构,再回头看算法。1.基本查找​ 也叫做顺序查找​说明:顺序......
  • UFCFT4-15-3 加密系统算法
    MODULARPROGRAMMECOURSEWORKASSESSMENTSPECIFICATIONModuleDetailsModuleCodeUFCFT4-15-3 Runsem3FIRSTSIT2023/24 ModuleTitleCryptographyModuleLeader ModuleTutorsSMLAUComponentandElementNumberProgram(includingsourcecodeandexecutable)and......
  • 基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护
    基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护传输数据-编码型&加密型等传输格式-常规&JSON&XML等密码存储-Web&系统&三方应用代码混淆-源代码加密&逆向保护加密:1.常见加密编码进制等算法解......
  • 探索编程世界的宝藏:程序员必掌握的20大算法
    #程序员必须掌握哪些算法?#1引言在当今数字化时代,程序员们仍然需要拥有一把解决问题和优化代码的金钥匙。这些钥匙是算法,它们隐藏在计算机科学的宝藏中,等待着我们去发现和掌握。本篇博文将带你踏上一段引人入胜的探险之旅,揭开程序员必须掌握的20大算法的神秘面纱。从冒泡排序到......
  • c++算法之动态规划:01背包
    什么是动态规划?动态规划算法(dynamicprograming),是一种由递推为基础的比贪心更稳定的一种优化策略,为运筹学的一部分。就是通过以递推为基础的手段非暴力求出最值。它的总体思想其实就是一个比较过程:假如你有一个数据,它的价值是x,代价为y,如果用动态规划就是和你不加这个元素和你加......
  • 欧几里得算法(辗转相除法)-- 实现分数计算
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-"""利用欧几里得算法实现一个分数类,支持分数的四则运算(加法)"""classFraction:def__init__(self,a,b):self.a=aself.b=bx=self.gcd(a,b)se......