【分布式】分布式限流方案解析

文章目录

  • 固定窗口限流方案​
    • 实现方式​
    • 优点​
    • 缺点​
  • 滑动窗口限流方案​
    • 实现方式​
    • 优点​
    • 缺点​
  • 令牌桶限流方案​
    • 实现方式​
    • 优点​
    • 缺点​
  • 漏斗限流方案​
    • 实现方式​
    • 优点​
    • 缺点​

在分布式系统蓬勃发展的当下,系统面临的流量挑战日益复杂。为确保系统在高并发场景下的稳定性与可用性,限流策略成为了关键防线。本文将深入探讨固定窗口、滑动窗口、令牌桶以及漏斗这四种常见的分布式限流方案,详细剖析它们的实现原理、各自的优缺点,助力开发者在实际项目中做出最优选择。​

固定窗口限流方案​

实现方式​

固定窗口限流是最为基础的限流策略。它将时间划分为固定长度的窗口,在每个窗口内,记录请求的数量。当请求到达时,判断当前窗口内的请求计数是否超过设定的阈值。若未超过,则允许请求通过,并将计数加一;若超过阈值,则拒绝请求。例如,设定一个窗口时长为 1 分钟,限流阈值为 100 次请求。在每分钟开始时,计数器重置为 0,每来一次请求,计数器增加 1,若在这 1 分钟内请求次数达到 101 次,后续请求将被拒绝。​

优点​

实现简单:逻辑直接明了,易于理解和编码实现,对开发人员的技术要求相对较低。​
计算量小:仅需维护一个简单的计数器和时间窗口标识,在高并发场景下,对系统资源的消耗较少。​

缺点​

存在流量突刺问题:假设窗口时长为 1 分钟,限流阈值为 100。在第一个窗口的最后一秒涌入 100 个请求,紧接着下一个窗口开始的第一秒又涌入 100 个请求,这样在 2 秒内系统就承受了 200 个请求,远超预期的平均限流速率,可能导致系统瞬间压力过大甚至崩溃。​
限流不够精准:它只能控制每个固定窗口内的总请求数,无法对窗口内不同时间段的流量进行精细控制。​

滑动窗口限流方案​

实现方式​

滑动窗口是对固定窗口的优化。它将时间窗口进行细分,例如把 1 分钟的窗口划分为 60 个 1 秒的小窗口。每个小窗口都有独立的请求计数。随着时间推移,窗口像滑动门一样逐步移动,旧的小窗口移出,新的小窗口移入。当请求到达时,不仅要判断当前所在小窗口的请求计数,还要综合考虑滑动窗口内所有小窗口的请求总数是否超过阈值。例如,1 分钟的滑动窗口划分为 60 个小窗口,限流阈值为 100。如果当前第 30 秒的小窗口内已有 5 个请求,而滑动窗口内累计请求数为 90,此时再有新请求到达,计算滑动窗口内(包含当前小窗口)的总请求数为 95,未超过 100,则允许请求通过。​

优点​

解决流量突刺问题:通过细分窗口和动态滑动,有效避免了固定窗口在窗口切换时可能出现的流量集中冲击,使限流更加平滑。​
限流更精准:能够对时间窗口内不同时刻的流量进行更细致的把控,更符合实际业务中流量分布不均匀的特点。​

缺点​

实现复杂度增加:需要维护多个小窗口的计数,以及处理窗口滑动的逻辑,代码实现相对复杂。​
资源消耗增加:由于要记录多个小窗口的状态,占用的内存等系统资源比固定窗口更多,在大规模分布式系统中,资源开销不容忽视。​

令牌桶限流方案​

实现方式​

令牌桶算法中,系统以固定的速率生成令牌并放入桶中。桶有固定的容量,当桶满时,新生成的令牌会被丢弃。每个请求在通过限流时,需要从桶中获取一个令牌。如果桶中有足够的令牌,请求可以通过;若桶中没有令牌,则请求被拒绝。例如,令牌生成速率为每秒 10 个,桶的容量为 100 个。系统会每秒向桶中添加 10 个令牌,当请求到来时,尝试从桶中取一个令牌,若桶中有令牌则请求通过,若桶为空则请求被限流。​

优点​

允许一定程度的突发流量:因为桶可以预先积累一定数量的令牌,所以在短时间内,系统能够处理比平均速率更高的流量,适应业务中偶尔出现的突发请求场景。​
限流规则灵活:通过调整令牌生成速率和桶的容量,可以轻松实现不同的限流策略,满足多样化的业务需求。​

缺点​

实现相对复杂:需要设计令牌生成、存储以及获取的机制,涉及到定时任务、数据结构等知识,开发难度较固定窗口有所提升。​
对令牌生成速率的设置要求较高:若令牌生成速率设置不合理,可能导致系统在高并发下无法有效限流或者资源利用不充分。​

漏斗限流方案​

实现方式​

漏斗算法类似于一个底部有小孔的漏斗,请求就像水一样流入漏斗。漏斗以固定的速率将请求流出(处理请求),当漏斗中的请求数量超过漏斗的容量时,新流入的请求将被拒绝。例如,漏斗的容量为 50,流出速率为每秒 5 个请求。当请求不断进入漏斗时,若漏斗内请求数未超过 50,请求按每秒 5 个的速率被处理;若漏斗已满,再有新请求进入则被限流拒绝。​

优点​

流量处理平滑:能保证请求以固定的速率被处理,不会出现流量忽大忽小的情况,对于一些对流量稳定性要求较高的系统,如数据库读写操作,能有效保护后端资源。​
实现相对简单:相较于令牌桶,漏斗算法的逻辑更为直接,只需关注请求的流入、漏斗容量以及流出速率,易于理解和实现。​

缺点​

不支持突发流量:由于请求只能以固定速率流出,无法应对业务中突然出现的大量请求,可能导致在突发流量下大量请求被拒绝,影响用户体验。​
资源利用率较低:在流量低谷期,漏斗仍以固定速率处理请求,可能造成系统资源闲置,不能充分利用系统的处理能力。​
综上所述,不同的分布式限流方案各有优劣。在实际应用中,开发者需要根据业务场景的特点,如流量特性(是否有突发流量、对流量稳定性要求等)、系统资源状况、开发成本等因素,综合权衡选择最适合的限流方案,以保障分布式系统的稳定高效运行。

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

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

相关文章

WPS JS宏编程教程(从基础到进阶)-- 第三部分:JS宏编程语言开发基础

第三部分:JS宏编程语言开发基础 @[TOC](第三部分:JS宏编程语言开发基础)**第三部分:JS宏编程语言开发基础**1. 变量与数据类型**变量声明:三种方式****示例代码****数据类型判断****实战:动态处理单元格类型**2. 运算符全解析**算术运算符****易错点:字符串拼接 vs 数值相…

Python - 爬虫-网页抓取数据-库urllib

urllib库是Python内置的HTTP请求库。无需额外安装,可以直接使用。urllib库包含以下四个模块。 urllib.request - 打开和读取 URL。urllib.error - 包含 urllib.request 抛出的异常。urllib.parse - 解析 URL。urllib.robotparser - 解析 robots.txt 文件。 1、reque…

C++进阶知识复习 1~15

C 进阶总复习 (1~15) 目的1. 介绍下程序从编写到可执行的整个过程2. C中的auto和decltype的区别3. 介绍下多态的实现原理4. C中的new[] 和delete[] 为什么一定要配对使用?5. C中malloc申请的内存 可以使用delete释放嘛6. 什么情况下会出现内存…

输电线路航空标志球:低空飞行的安全路标 / 恒峰智慧科技

在现代社会,随着航空业的快速发展,低空飞行活动日益频繁。为了确保飞行安全,避免飞机与高压电线等障碍物发生碰撞,输电线路航空标志球应运而生。这种装置被广泛应用于高压输电线路上,尤其是超高压和跨江输电线&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件详解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件详解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件详解 在 Debian/Ubuntu 系统中,/etc/network/interfaces 是传统网络接口配置文件,用于定义网络接口的静态/动态配置。以下是逐项解…

OpenCV 图形API(或称G-API)(1)

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 引言 OpenCV 图形API(或称G-API)是一个新的OpenCV模块,旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解题思路2. 代码实现 题目链接:3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解题思路 这一题大的思路上不难想到就是一个动态规划的思路。我们分别…

win10之mysql server 8.0.41安装

一 mysql server 下载 官网下载地址页面 https://dev.mysql.com/downloads/mysql/二 免装版使用步骤 1 解压 下载完成后,解压文件夹,如下所示: 2 执行安装命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二届蓝桥杯省赛软件类(cc++组)

第一题&#xff08;空间&#xff09; 解题思路 答案 #include <stdio.h>int main() {// 计算256MB对应的字节数&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每个32位二进制整数占4个字节&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移动语义

文章目录 一、移动语义1、为什么需要移动语义&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何实现移动语义&#xff1f;——移动构造函数/赋值4、什么时候触发移动&#xff1f;5、移动 vs 拷贝 一、移动语义 1、为什么需要移动语…

wsl下ubuntu安装宝塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安装宝塔面板的步骤如下&#xff1a; 1. 确保 WSL 环境正常 已安装 WSL 2 并启用 Ubuntu 发行版&#xff08;推荐 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中检查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP网络通信

UDP网络通信&#xff1a; 步骤1 创建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);参数一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA节点探测是干什么用的?

想象一个大城市被划分成几个区&#xff08;比如东区、西区&#xff09;。每个区有自己的超市&#xff08;内存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本区的超市买东西最快&#xff0c;去其他区的超市会慢一些。 NUMA节点探测&#xff0c;就是Linux系统在…

使用 Less 实现 PC 和移动端样式适配

&#x1f310; 使用 Less 实现 PC 和移动端样式适配 —— 以 position 属性为例 在前端开发中&#xff0c;我们常常会遇到这样一个场景&#xff1a; 在 PC 页面中需要某个元素是 position: relative;&#xff0c;但在移动端却希望它是 position: inherit;&#xff0c;以便更灵…

企业战略管理(设计与工程师类)-2-战略规划及管理过程-1-概述

战略管理过程 参考资料&#xff1a; 战略管理 - 清华大学- 蔡临宁公司战略与风险管理 - 华中科技大学 - 贺远琼战略管理 - 北京理工大学 - 杨万荣DeepSeek - 深度思考与联网检索 AFI框架 战略管理最典型的就是采用传统的AFI通用战略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并发原理以及技术实现对比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架虽然都支持高并发&#xff0c;但它们的实现原理、底层机制和适用场景有显著差异。以下从 高并发原理、技术实现区别、优缺点 三个方面详细分析&#xff1a; 一、高并发实现原理 1. Hyperf (PHP Swoole) Hyperf 的高并发能力基于 Swoo…

【教程】如何利用bbbrisk一步一步实现评分卡

利用bbbrisk一步一步实现评分卡 一、什么是评分卡1.1.什么是评分卡1.2.评分卡有哪些 二、评分卡怎么弄出来的2.1.如何制作评分卡2.2.制作评分卡的流程 三、变量的分箱3.1.数据介绍3.2.变量自动分箱3.3.变量的筛选 四、构建评分卡4.1.评分卡实现代码4.2.评分卡表4.3.阈值表与分数…

AI日报 - 2025年4月2日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL训练可诱发模型顿悟&#xff0c;Anthropic发布Claude 3.5内部机制研究&#xff0c;简化语言模型推理优化新方法提出。 DeepSeek-R1无需额外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 网络穿透:如何从外部访问 K8s Pod 地址

文章目录 探索 Kubernetes 网络穿透&#xff1a;如何从外部访问 K8s Pod 地址为什么需要外部访问 Pod 地址&#xff1f;常见的网络穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;为开发调试提供便捷穿透 实践建议与注意事项各方案对比表总…

深入理解 Apache Dagster:数据管道编排实战指南

本文系统介绍了 Apache Dagster 的核心概念与实践方法&#xff0c;涵盖环境搭建、管道定义、运行调试及高级功能&#xff0c;帮助开发者快速掌握这一现代化数据编排工具&#xff0c;提升数据工程效率。 1. 背景与核心优势 随着数据驱动应用的复杂化&#xff0c;传统工具在可维…