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

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

一、计数器算法

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

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

二、滑动窗口算法

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

【1】 把3秒钟划分为3个小窗,每个小窗限制请求不能超过50秒。

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

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

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

会存在三种情况:

请求速度 大于 令牌生成速度】当令牌被取空后,会被限流

请求速度 等于 令牌生成速度】流量处于平稳状态

请求速度 小于 令牌生成速度】请求可被正常处理,桶满则丢弃令牌

如图所示:

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

主要的作用:

【1】 控制数据注入网络的速度。

【2】 平滑网络上的突发流量。

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

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

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

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

相关文章
|
3天前
|
缓存 算法 Java
限流算法 - 基本实现
限流算法 - 基本实现
27 0
|
3天前
|
数据采集 算法 双11
高并发的场景下,不能不说的限流算法
高并发的场景下,不能不说的限流算法
28 1
|
3天前
|
存储 算法 NoSQL
|
3天前
|
算法 NoSQL JavaScript
常见的限流算法-python版本
常见的限流算法-python版本
22 0
常见的限流算法-python版本
|
3天前
|
存储 算法 NoSQL
常见限流算法及其实现
在分布式系统中,随着业务量的增长,如何保护核心资源、防止系统过载、保证系统的稳定性成为了一个重要的问题。限流算法作为一种有效的流量控制手段,被广泛应用于各类系统中。本文将详细介绍四种常见的限流算法、两种常用的限流器工具,从原理、源码的角度进行分析。
161 0
|
3天前
|
算法 Go API
限流算法~
限流算法~
37 1
|
3天前
|
存储 算法 网络协议
服务治理之常用限流算法总结
服务治理之常用限流算法总结
51 0
服务治理之常用限流算法总结
|
3天前
|
缓存 算法 NoSQL
常见限流算法解读
常见限流算法解读
|
6月前
|
数据采集 缓存 算法
最常用的限流算法以及如何在http中间件中加入流控
最常用的限流算法以及如何在http中间件中加入流控
|
8月前
|
缓存 弹性计算 算法
Java高并发系统限流算法的应用
Java高并发系统限流算法的应用
65 0