接口限频算法:漏桶算法、令牌桶算法、滑动窗口算法

文章目录

  • 限频三大算法对比与选型建议
  • 一、漏桶算法(Leaky Bucket Algorithm)
    • 1.核心原理
    • 2.实现
    • 3.为什么要限制漏桶容量
    • 4.优缺点分析
  • 二、令牌桶算法(Token Bucket Algorithm)
    • 1.核心原理
    • 2.实现
      • (1)单机实现
      • (2)分布式实现
    • 3.优缺点分析
  • 三、滑动窗口算法(Sliding Window Algorithm)
    • 1.核心原理
    • 2.实现
    • 3.优缺点分析

限频三大算法对比与选型建议

维度漏桶算法令牌桶算法滑动窗口算法
流量平滑性强(固定速率)中(允许突发)弱(依赖窗口粒度)
实现复杂度简单中等(需处理令牌生成)中等(需处理窗口滑动)

一、漏桶算法(Leaky Bucket Algorithm)

1.核心原理

漏桶算法的核心是恒定速率输出,无论输入流量如何波动,输出始终保持稳定。其工作机制可类比为一个底部有固定孔径的水桶:

  • 输入:请求以任意速率流入桶中(如突发流量)。
  • 输出:桶以固定速率(如100请求/秒)处理请求,超出桶容量的请求直接丢弃。

2.实现

  • 实现:使用队列存储请求,通过定时任务以固定速率从队列中取出请求处理。若队列满则拒绝新请求。

在非单节点场景下,可使用消息队列中间件,或者Redis模拟队列,来实现这个算法。

3.为什么要限制漏桶容量

有容量限制 vs 无容量限制:对比分析

场景有容量限制(标准漏桶)无容量限制(无限漏桶)
流量平滑效果✅ 稳定输出,突发请求被缓存或丢弃✅ 稳定输出(但突发请求全部缓存)
内存/缓冲区占用🟡 有限占用(取决于桶容量)❌ 可能无限占用,导致OOM(内存溢出)
突发流量处理🟡 超过容量的请求被丢弃,保护下游系统❌ 缓存所有请求,下游可能被持续高负载拖垮
适用场景真实系统(如API接口限频、网络流量控制)理论场景(无实际意义,无法用于生产环境)

4.优缺点分析

  • 优点
    • 绝对平滑:严格控制输出速率,适合对稳定性要求极高的场景(如金融交易接口)。
    • 实现简单:只需维护队列和固定速率处理器,无需复杂逻辑。
  • 缺点
    • 资源浪费:突发流量会被直接丢弃,无法利用系统空闲资源。
    • 灵活性差:无法区分请求优先级,所有超额请求同等处理。

二、令牌桶算法(Token Bucket Algorithm)

1.核心原理

令牌桶算法通过令牌生成与消耗实现限流,允许一定程度的突发流量:

  • 令牌生成:系统以固定速率(如100令牌/秒)向桶中添加令牌,桶容量上限为burst_size(如200令牌)。
  • 请求处理:每个请求需消耗一个令牌,无令牌则拒绝。若桶满,新生成的令牌会被丢弃。

2.实现

(1)单机实现

Guava的RateLimiter采用令牌桶算法,支持动态调整速率和突发容量。

RateLimiter rateLimiter = RateLimiter.create(100.0); // 每秒生成100令牌
if (rateLimiter.tryAcquire()) { // 尝试获取令牌// 处理请求
} else {// 限流
}

(2)分布式实现

在分布式系统中,可以利用 Redis 的原子操作和 Lua 脚本来实现一个线程安全的令牌桶。

  • 使用 Redis 实现令牌桶的关键在于:
    • 使用原子操作保证令牌增减的线程安全
    • 实现令牌的自动生成逻辑
    • 高效地判断是否允许请求通过
原子操作
允许
拒绝
获取令牌数与时间戳
执行Lua脚本
计算时间差
计算新生成令牌数
计算当前可用令牌数
判断是否足够?
消耗令牌
拒绝请求
更新Redis状态
返回处理结果
客户端请求
获取当前时间戳
拼接Redis键
是否允许?
执行业务逻辑
返回限流响应

3.优缺点分析

  • 优点
    • 支持突发流量:允许短时间内消耗桶内累积的令牌,提升资源利用率(如电商秒杀)。
    • 参数灵活:可通过调整rate(平均速率)和burst_size(突发容量)平衡平滑性与突发性。
  • 缺点
    • 实现复杂度较高:需维护令牌生成、存储和消耗逻辑。
    • 流量尖刺风险:突发流量可能瞬间耗尽令牌,导致后续请求被拒绝。

三、滑动窗口算法(Sliding Window Algorithm)

1.核心原理

滑动窗口算法通过时间窗口划分与计数实现限流,精度随窗口细分而提升:

  • 窗口划分:将时间轴划分为多个固定长度的子窗口(如1秒划分为10个0.1秒的子窗口)。
  • 计数与滑动:统计当前窗口内的请求数,当窗口滑动时,旧子窗口的计数逐渐过期。

2.实现

在分布式系统中,可以利用 Redis 的原子操作和 Lua 脚本来实现一个这个算法。

Redis Lua脚本逻辑
获取窗口内所有时间戳
通过Lua脚本操作Redis
移除过期时间戳< current_time - T
添加当前时间戳到窗口
统计窗口内时间戳数量
判断数量是否超过阈值N
客户端请求
获取当前时间戳
生成窗口键key
拒绝请求
允许请求

3.优缺点分析

  • 优点
    • 时间敏感性强:可精确控制时间维度的请求频率(如“每分钟最多100次”)。
    • 动态调整窗口:支持秒级、分钟级等不同粒度的限流规则。
  • 缺点
    • 临界问题:窗口切换时可能出现双倍请求(如0.9秒和1.1秒各发100次)。
    • 分布式同步成本:需依赖Redis等分布式缓存,引入额外延迟。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5 盒子模型

1. 盒子模型的概念 2. 边框&#xff08;border&#xff09; 边框颜色&#xff08;border-color&#xff09; 边框粗细&#xff08;border-width&#xff09; 边框样式&#xff08;border-style&#xff09; border简写&#xff08;border&#xff1a;&#xff09; 3. 外边距&am…

【Linux】Linux高级I/O

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/128345976 一、五种IO模型 阻塞式I/O非阻塞式I/OI/O复用&#xff08;多路转接&#xff09;信号驱动式I/O异步I/O I/O我们并不陌生&#xff0c;简单的说就是输入输出&#xff1b;对于一个输入操作通常包…

关于界面存在AB测试后UI刷新空白的问题

问题描述&#xff1a; 在同一页面存在AB面&#xff0c;A和B同时都有一个rv&#xff0c;然后A面的rv填充不了数据&#xff0c;B面的可以。 问题解决&#xff1a; header_task布局里的include_new_gift_sign里有一个和外层一样id的recyclerview include的标签的作用是。在infl…

Go 协程(Goroutine)入门与基础使用

一、什么是协程&#xff08;Goroutine&#xff09;&#xff1f; 简单来说&#xff0c;协程是由 Go 语言运行时管理的轻量级线程。相比系统线程&#xff0c;它的调度开销极小&#xff0c;内存占用非常少&#xff08;默认只需 2KB 栈空间&#xff09;。 你可以在一个程序中轻松…

matlab 各种智能优化算法

1. 优化算法相关 蚁群优化算法&#xff08;ACO&#xff09; 蚁群优化算法是一种模拟蚂蚁觅食行为的优化技术。以下是一个简化版的ACO用于解决旅行商问题&#xff08;TSP&#xff09;的MATLAB代码&#xff1a; function [bestRoute, minDist] acoTsp(distMatrix, numAnts, n…

Hilt -> Android 专属依赖注入(DI)框架

Hilt 是 Google 基于 Dagger 封装的 Android 专属依赖注入&#xff08;DI&#xff09;框架&#xff0c;显著简化了依赖管理流程&#xff0c;提升代码可维护性和可测试性。以下是核心要点及使用指南&#xff1a; dagger2: Dagger 2 原理和使用-CSDN博客 Hilt vs Dagger2&…

AISHELL-5 全球首套智能驾舱中文语音交互数据集开源

随着汽车成为人们日常生活中不可或缺的一部分&#xff0c;而驾驶舱中传统的触摸交互方式容易分散驾驶员的注意力&#xff0c;存在安全风险&#xff0c;因此&#xff0c;车内基于语音的交互方式得到重视。与通常家庭或会议场景中的语音识别系统不同&#xff0c;驾驶场景中的系统…

openstack之neutron(一)

NFV基础 neutron是对二层物理网络的抽象与管理&#xff0c;实例的网络功能由连接到vSwitch的端口上的vNIC共同实现&#xff0c;再通过物理服务器的物理网卡访问外部的物理网络。 NFV实现 网卡虚拟化&#xff1a;tap、tun、veth&#xff1b; 交换机虚拟化&#xff1a;linuxbri…

【Java】Arrays.sort:TimSort

一&#xff0c;概述 书接前文【Java】Arrays.sort:DualPivotQuicksort-CSDN博客 Arrays.sort对基本数据类型使用了双轴快速排序&#xff0c;但是对Object[]类型&#xff0c;则使用了TimSort&#xff0c;TimSort是稳定的排序&#xff0c;它整合了插入排序归并排序&#xff0c;…

一个n8n构建的能和LLM对话的Agent

一个n8n构建的能和LLM对话的Agent 1.OLLAMA1.1.下载和安装1.2.设置环境变量1.3.重启ollama1.4.测试1.5.拉取模型2.n8n部署2.1. 镜像拉取和启动2.2.注册和登录2.3.新建一个工作流3.说在后面的话环境搭建说明: windows(RTX 5090)+VM CENTOS 采用本地化的ollama运行LLM n8n是一…

升级 Ubuntu Linux 内核的几种不同方法

方法 &#xff11; &#xff0d; 使用 dpkg 升级 Linux 内核&#xff08;手动方式&#xff09; 这个方法可以帮助你从 kernel.ubuntu.com 网站手动下载可用的最新 Linux 内核。如果你打算安装最新版&#xff08;而不是稳定版或者正式发布版&#xff09;&#xff0c;那这种方法…

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…

Linux 内核 Slab 分配器核心组件详解

Slab 分配器是 Linux 内核中用于高效管理内存的机制&#xff0c;其核心目标是通过对象缓存减少内存碎片和分配/释放开销。以下详细解析其核心组件及其协作关系&#xff1a; 一、Slab 系统的核心组件 组件 描述 作用场景 Slab 描述符 每个 Slab 的管理结构&#xff08;如 struc…

Oracle 的AHF (Automatic Health Framework) 工具

Oracle 的AHF (Automatic Health Framework) 工具 Oracle AHF (Automatic Health Framework) 是 Oracle 官方提供的诊断工具集合&#xff0c;用于自动收集、分析和诊断 Oracle 数据库及集群环境的健康状态和问题。 一 AHF 核心功能概述 1. 主要组件 TFA (Trace File Analyz…

华为服务器obsutil使用方法

本文不生产技术&#xff0c;只做技术的搬运工&#xff01;&#xff01;&#xff01; 前言 最近在使用华为云服务器进行模型训练&#xff0c;发现其上传下载文件都极慢&#xff0c;询问华为官方人员是否限速&#xff0c;对方推荐使用obsutil作为中转服务进行下载&#xff0c;在…

【大模型训练】中短序列attention 和MOE层并行方式(二)

我们考虑一个典型的Transformer模型结构&#xff0c;在多层堆叠中&#xff0c;其中包含Attention层和MoE层&#xff08;FeedForward层被替换为MoE层&#xff09;。在模型最后是LM Head&#xff08;语言模型头&#xff09;&#xff0c;通常是一个全连接层&#xff0c;将隐层向量…

2025-06-09(批量智能裁剪视频尺寸并延长视频时长)

import os import subprocess import random import json # 配置参数 TARGET_WIDTH 500 TARGET_HEIGHT 600 TARGET_DURATION 180 # 目标时长&#xff08;秒&#xff09; OUTPUT_DIR "processed_videos" MIRROR_MODES ["none", "horizontal&quo…

CKA考试知识点分享(9)---gateway api

CKA 版本&#xff1a;1.32 第九套题是涉及gateway api相关。 注意&#xff1a;本文不是题目&#xff0c;只是为了学习相关知识点做的实验。仅供参考 实验目的 创建一个gateway api&#xff0c;来实现后端镜像的外部访问。 gateway api 通过nginx实现 实验开始 安装nginx ga…

Kafka 消息模式实战:从简单队列到流处理(一)

一、Kafka 简介 ** Kafka 是一种分布式的、基于发布 / 订阅的消息系统&#xff0c;由 LinkedIn 公司开发&#xff0c;并于 2011 年开源&#xff0c;后来成为 Apache 基金会的顶级项目。它最初的设计目标是处理 LinkedIn 公司的海量数据&#xff0c;如用户活动跟踪、消息传递和…

Linux中使用yum安装MYSQL

1、关系型数据库 MySQL 使用 yum 安装mysql 1、检查是否已经安装 Mysql rpm -qa | grep mysql如果安装了 就进行卸载 rpm -e mysql-community-libs-5.7.44-1.el7.x86_64 rpm -e mysql57-community-release-el7-11.noarch rpm -e mysql-community-common-5.7.44-1.el7.x86_64…