接口限流经典算法

2024-08-24 13:28
文章标签 算法 接口 经典 限流

本文主要是介绍接口限流经典算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 限流
    • 基于计数器的限流
    • 基于滑动窗口的限流
    • 桶漏斗算法
    • 令牌桶算法

限流

为了保证系统的安全性和稳定性,防止恶意流量和突发大量流量短时间内大量请求接口,造成服务器崩溃,接口的限流是有必要的。
以下是四种经典的限流算法。

基于计数器的限流

在一定的时间区间内记录请求次数,到下一个区间就清零
如果请求时当前区间的请求次数已经达到了阈值,不予请求。

优点:简单易理解
缺点:有临界问题
在这里插入图片描述

基于滑动窗口的限流

可以把上面的时间区间更小粒度的划分,分为更小的独立区间

比如一开始是1分钟,划分为10s,每次经过10s,我们自然需要把整个计数区间往右边移动一个

优点:

  • 可以通过调整窗口大小来实现不同的限流效果
  • 可扩展性强

如果切分越小,产生的块就多,窗口滚动越平滑,限流统计越准确,但是对服务器压力越大
在这里插入图片描述

桶漏斗算法

控制水流稳定流出,进水就是向接口发起的请求,一定有时快有时慢,但是漏水的速度是一定的,只要桶装满了就拒绝请求

我们只需要处理漏斗稳定流出的水流即可

明显用队列实现

缺点是对于一些突发流量,还是像之前一样处理,降低用户体验,损失请求。
在这里插入图片描述

令牌桶算法

把令牌以稳定的速度放入桶中,如果桶被放满了,多余的令牌就无法放入

每来一个请求就必须从桶中申请令牌,申请到了才能被处理

可以用队列存储令牌

在这里插入图片描述

漏桶里面的任务是一点点执行的,令牌桶有可能一下子把令牌全用光一起执行,这样就可以很快的处理大流量的请求

缺点:

  • 实现复杂
  • 需要在固定时间内生成令牌,时间精度要求高

对于令牌桶的实现可以用Google提供的工具ლ(´ω`ლ)゙

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1-jre</version>
</dependency>

RateLimiter可以用来对令牌桶进行管理

//创建令牌桶
RateLimiter rateLimiter = RateLimiter.create(20);//尝试从令牌桶中拿令牌(设置超时时间)
boolean acquire = rateLimiter.tryAcquire(200, TimeUnit.MILLISECONDS);

实际项目中,推荐采用令牌桶算法+自定义注解的方式,实现对每个接口的限流管理。

这篇关于接口限流经典算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1102610

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.