分布式系统架构:限流设计模式
1.为什么要限流?
任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,就应该要有取舍,建立面对超额流量自我保护的机制,而这个机制就是微服务中常说的“限流”
2.四种限流设计模式
说到限流,大家直接的想法就是Sentinel,但是Sentinel限流的原理可能很多人没去深入理解,或者限流到底是怎么做的?具体如何进行限流,业界内也有一些常见设计模式。
2.1流量计数器模式
流量计数器是一种最简单的限流方式,通过记录固定时间窗口内的请求次数来判断是否达到限流阈值。如果请求次数超过限制值,则拒绝后续请求。
实现方式:
-
将时间划分为固定的时间窗口(如 1 秒、1 分钟)。
-
每个窗口维护一个计数器,记录当前时间窗口内的请求次数。
-
如果计数器值超过限流阈值,直接拒绝请求;否则增加计数器。
固定窗口边界问题:
-
在窗口边界的两端,可能存在短时间内超量请求的“临界问题”
比如场景设定:一秒内的TPS大于80时,就限流。
存在问题:即使每一秒的统计流量都没有超过 80 TPS,也不能说明系统没有遇到过大于 80 TPS 的流量压力。比如说系统在连续2秒内都收到60TPS的请求,但是请求发生的时间分别在第1秒的后0.5秒,以及第2秒的前0.5秒。这样系统实际曾在1秒内发生超过80 TPS的请求。
-
即使连续若干秒统计流量超过阈值,也不能说明流量压力一定超过系统承受能力
假设 10 秒的时间片段中,前 3 秒的 TPS 平均值到了 100,而后 7 秒的平均值是 30 左右,此时系统是否能够处理完这些请求而不产生超时失败?答案是可以的
存在缺陷:造成上面2个问题得原因是流量计数器模式是对时间点进行离散的统计
2.2滑动窗口模式
概念:时间轴上,一个固定大小的窗口随时间平滑滚动。任何时刻,静态地通过窗口内观察到的信息,都等价于一段长度与窗口大小相等的信息。主要是通过记录多个较小时间窗口(子窗口)的请求次数,实现更精细化的限流控制。
假设:准备观察的时间片段为 10 秒,以 1 秒作为统计精度,那可以得到一个长度为 10 的数组。设定限流阈值是最近 10 秒内收到的请求不超过 500 个,那么就需要统计10个子数组的请求总数,是否超过阈值。
优点:
-
解决了固定窗口边界问题
缺点:
-
只适用于否决式限流,超过阈值的流量就必须失败
2.3漏桶模式
漏桶可以简单的理解:小学水池应用题,一个水池,每秒以 X 升速度注水,同时又以 Y 升速度出水,问水池啥时候装满。
概念:将请求视为流入漏桶的水,漏桶以固定速率“漏水”。当请求流量超过漏桶的处理能力时,多余的请求会被丢弃或排队。其核心思想是平滑请求流量
实现方式:
-
维护一个队列(或计数器),用来模拟漏桶。
-
新请求到来时,将请求放入桶中。
-
按固定速率处理桶中的请求。
-
如果桶已满,则拒绝新请求。
缺点:
-
比较难确定桶的大小和水流出的速度
2.4令牌桶算法
和漏桶一样是基于缓冲区的限流算法,简单理解就是去银行办事时在排队机号取号的场景。
概念:通过固定速率向桶中添加令牌,请求到来时需要先消耗令牌才能被处理。如果桶中没有足够的令牌,请求会被拒绝。与漏桶算法不同,令牌桶允许一定的突发流量。
实现方式
-
维护一个桶,桶中存储令牌。
-
按固定速率(比如限流是1秒100次请求,那么间隔10ms时间放入令牌)向桶中添加令牌,直到桶满为止。
-
请求到来时从桶中取出令牌,如果没有令牌就马上失败或者进入降级逻辑。
实际开发的时候,不需要专门做放令牌到桶里这件事,只需要在获取令牌前,比较一下时间戳与当前时间,就能算出需要放入多少令牌,下面是示例代码:
private long lastTime = System.currentTimeMillis();
private int tokens = 0; // 当前令牌数
private static final int LIMIT = 100; // 桶容量
private static final int REFILL_RATE = 10; // 令牌添加速率(令牌/秒)public synchronized boolean tryAcquire() {long now = System.currentTimeMillis();// 添加令牌tokens = Math.min(LIMIT, tokens + (int) ((now - lastTime) / 1000) * REFILL_RATE);lastTime = now;if (tokens > 0) {tokens--;return true;}return false;
}
3.分布式限流
上面介绍的4种限流算法都只适用于单机限流,或者把系统当做整体来限流。实际应用中仍然需要精细的每个服务的限流。
概念:过将限流逻辑分散到多个节点,同时使用一致性算法保证全局限流的一致性。它结合了本地限流和集中式限流的优点。
实现方式
-
基于 Redis + Lua 脚本使用 Redis 脚本实现分布式限流,在 Redis 中存储全局的请求计数器
-
基于一致性算法使用分布式一致性算法(如 Raft、Paxos)维护全局流量状态
-
分布式网关通过 API 网关(如 Kong、Nginx、Spring Cloud Gateway)实现流量的统一调度和限流。
缺点:
-
实现复杂度高,且网络通信和一致性操作带来额外延迟。当流量大时,限流本身会降低系统处理能力
总结
今天学习了4种限流设计模式:流量计数器模式、滑动窗口模式、漏桶模式、令牌桶模式,后面2种都是基于缓冲区的限流算法。简单了解了下分布式限流的概念。限流本身是有代价的,实际开发中需要权衡方案的代价和收益。后续有时间补充Sentinel的限流原理和其中用了哪些设计模式。
文章转载自:卷福同学
原文链接:https://www.cnblogs.com/dnboy/p/18621955
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构
相关文章:

分布式系统架构:限流设计模式
1.为什么要限流? 任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,就应该要有取舍,建立面对超额流量自我保护的机制,而这个机制就是微服务中常说的“限流” 2.四种限流…...
G口带宽服务器与1G独享带宽服务器:深度剖析其差异
在数据洪流涌动的数字化时代,服务器作为数据处理的核心,其性能表现直接关系到业务的流畅度和用户体验的优劣。随着技术的飞速发展,G口带宽服务器与1G独享带宽服务器已成为众多企业的优选方案。然而,这两者之间究竟有何细微差别&am…...

Flamingo:少样本多模态大模型
Flamingo:少样本多模态大模型 论文大纲理解1. 确认目标2. 分析过程(目标-手段分析)3. 实现步骤4. 效果展示5. 金手指 解法拆解全流程核心模式提问Flamingo为什么选择使用"固定数量的64个视觉tokens"这个特定数字?这个数字的选择背…...

推荐一款免费且好用的 国产 NAS 系统 ——FnOS
一、系统基础信息 开发基础:基于最新的Linux内核(Debian发行版)深度开发,兼容主流x86硬件(ARM还没适配),自由组装NAS,灵活扩展外部存储。 使用情况:官方支持功能较多&am…...

2025系统架构师(一考就过):案例题之一:嵌入式架构、大数据架构、ISA
一、嵌入式系统架构 软件脆弱性是软件中存在的弱点(或缺陷),利用它可以危害系统安全策略,导致信息丢失、系统价值和可用性降低。嵌入式系统软件架构通常采用分层架构,它可以将问题分解为一系列相对独立的子问题,局部化在每一层中…...
开机存活脚本
vim datastadard_alive.sh #!/bin/bashPORT18086 # 替换为你想要检查的端口号 dt$(date %Y-%m-%d)# 使用netstat检查端口是否存在 if netstat -tuln | grep -q ":$PORT"; thenecho "$dt Port $PORT is in use" > /opt/datastadard/logs/alive.log# 如…...

车载网关性能 --- GW ECU报文(message)处理机制的技术解析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

CosyVoice安装过程详解
CosyVoice安装过程详解 安装过程参考官方文档 前情提要 环境:Windows子系统WSL下安装的Ubunt22.4python环境管理:MiniConda3git 1. Clone代码 $ git clone --recursive https://github.com/FunAudioLLM/CosyVoice.git # 若是submodule下载失败&…...

传统网络架构与SDN架构对比
传统网络采用分布式控制,每台设备独立控制且管理耗时耗力,扩展困难,按 OSI 模型分层,成本高、业务部署慢、安全性欠佳且开放性不足。而 SDN 架构将控制平面集中到控制器,数据转发由交换机负责,可统一管理提…...

如何打造用户友好的维护页面:6个创意提升WordPress网站体验
在网站运营中,无论是个人博主还是大型企业网站的管理员,难免会遇到需要维护的情况。无论是服务器迁移、插件更新,还是突发的技术故障,都可能导致网站短暂无法访问。这时,设计维护页面能很好的缓解用户的不满࿰…...

【hackmyvm】Zday靶机wp
HMVrbash绕过no_root_squash静态编译fogproject 1. 基本信息^toc 这里写目录标题 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描 3. fog project Rce3.1. ssh绕过限制 4. NFS no_root_squash5. bash运行不了怎么办 靶机链接 https://hackmyvm.eu/machines/machine.ph…...

redis使用注意哪些事项
1. 数据类型选择: • Redis支持多种数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。在选择…...

步进电机位置速度双环控制实现
步进电机位置速度双环控制实现 野火stm32电机教学 提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili PID模型 位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速…...
优化程序中的数据:从数组到代数
前言 我们往往都希望优化我们的程序,使之达到一个更好的效果,程序优化的一个重点就是速度,加快速度的一个好办法就是使用并行技术,但是,并行时我们要考虑必须串行执行的任务,也就是有依赖关系的任务&#…...

【电商搜索】CRM: 具有可控条件的检索模型
【电商搜索】CRM: 具有可控条件的检索模型 目录 文章目录 【电商搜索】CRM: 具有可控条件的检索模型目录文章信息摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果(包含重要数据与结论)相关工作后续优化方向 后记 https://arxiv.org/pdf/2412.…...
使用 ffmpeg 拼接合并视频文件
按顺序拼接多个视频文件 1、创建文件清单 创建一个文本文件 filelist.txt,列出所有要合并的视频文件。 格式如下: file path/to/video1.mp4 file path/to/video2.mp4 file path/to/video3.mp42、合并文件 下载FFmpeg,然后使用FFmpeg进行…...

【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)
目录 一、ADC采样的噪声简介1.1 常见的ADC噪声来源 二、信号的时域到频域转换2.1 傅里叶变换巧记傅里叶变换 三、傅里叶变换和滤波算法工程实现3.1 使用Matlab计算信号时域到频域的变换3.2 使用Matlab去除特定频点噪声寻找峰值算噪声频率构建陷波滤波器滤除噪声频点陷波滤波器与…...

Idea内,光标显示问题
键盘误触导致光标显示为白色块 解决方式 任选其一 键盘敲击 Ins 键(既 insert 键)Shift 0(数字零)...

回顾 python3中字符串
一. 简介 前面学习了 python3中的字符串, 本文回顾一下 python3中的字符串。 二. python3中的字符串 1. 创建字符串 字符串是 python中最常用的数据类型。我们可以使用引号( 或者 " )来创建字符串。 创建字符串很简单,…...
代码随想录day23 | leetcode 39.组合总和 40.组合总和II 131.分割回文串
39.组合总和 Java class Solution { List<List<Integer>> result new ArrayList<>();LinkedList<Integer> path new LinkedList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sor…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...