四种常用限流算法、固定窗口限流算法、滑动窗口限流算法、漏桶限流算法和令牌桶限流算法

2024-03-29 08:28

本文主要是介绍四种常用限流算法、固定窗口限流算法、滑动窗口限流算法、漏桶限流算法和令牌桶限流算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是限流?

限流可以被视为服务降级的一种形式,其核心目标是通过控制输入和输出流量来保护系统。通常,一个系统的处理能力是可以预估的,为了确保系统的稳定运行,当流量达到预定的阈值时,必须采取措施限制进一步的流量。这些措施可能包括延迟请求的处理时间、直接拒绝请求,或者部分地拒绝请求等策略。

为什么要做限流?

限流是一种面对资源有限性安全威胁时采取的防御措施,旨在自我保护。通过限流,系统能够使用有限的资源来最大化服务能力,确保在预期的流量范围内提供服务。

当流量超出这一范围时,系统会采取诸如拒绝服务、排队等待、服务降级等应对措施。在实际业务场景中,如限时秒杀活动、微博热搜等,用户流量可能会急剧增加。在这种情况下,后端服务的处理能力是有限的,如果无法妥善处理这些突发流量,后端服务可能会崩溃,进而导致整个系统的瘫痪。

此外,对于潜在的恶意流量,例如爬虫或DoS攻击,我们的服务必须以最大的恶意来防范可能的调用者行为。由于我们无法预知调用者将如何使用我们的服务,假设有调用者开启多个线程,全天候地进行密集调用,如果我们的服务没有适当的防护措施,那么服务的稳定性将受到严重威胁。因此,限流策略对于维护系统稳定性和防止恶意攻击至关重要。

四种常用限流算法

固定窗口限流算法:这种算法将时间分成固定的单位窗口,并在每个窗口期内限制请求的数量。如果窗口内的请求量未超过设定的阈值,则允许请求;否则,请求将被拒绝。每个窗口期结束后,计数器会重置。

(图源腾讯云)

这种算法简单直观,但在窗口切换时可能会出现突发流量。

(图源腾讯云)

滑动窗口限流算法:不同于固定窗口算法,滑动窗口算法将时间分为多个小周期,每个小周期都可以视为一个固定窗口。这样,即使在某一小周期内请求量超过了阈值,也可以在后续的小周期中补充处理这些请求,从而提供更平滑的限流效果。

(图源腾讯云)

下面这个图片更加容易理解

漏桶限流算法:漏桶算法通过控制数据流入网络的速度来防止网络拥塞。它使用一个“漏桶”来接收请求,桶内的水代表待处理的请求。水的流出速度是恒定的,而流入速度则是不确定的。当桶满时,新来的请求会被丢弃。

令牌桶限流算法:令牌桶算法也是用于限制单位时间内的请求数量。它以固定的速率向桶中添加令牌,请求需要消耗令牌才能被处理。如果桶中没有足够的令牌,请求将被限制或拒绝。

(图源腾讯云)

这篇关于四种常用限流算法、固定窗口限流算法、滑动窗口限流算法、漏桶限流算法和令牌桶限流算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858107

相关文章

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff