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

2024-03-29 08:28

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

什么是限流?

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

为什么要做限流?

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

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

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

四种常用限流算法

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

(图源腾讯云)

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

(图源腾讯云)

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

(图源腾讯云)

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

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

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

(图源腾讯云)

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



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

相关文章

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

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

基于Redisson实现分布式系统下的接口限流

《基于Redisson实现分布式系统下的接口限流》在高并发场景下,接口限流是保障系统稳定性的重要手段,本文将介绍利用Redisson结合Redis实现分布式环境下的接口限流,具有一定的参考价值,感兴趣... 目录分布式限流的核心挑战基于 Redisson 的分布式限流设计思路实现步骤引入依赖定义限流注解实现

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具