分布式 窗口算法 总结
前言
相关系列
- 《分布式 & 目录》
- 《分布式 & 窗口算法 & 总结》
- 《分布式 & 窗口算法 & 问题》
参考文献
- 《【算法】令牌桶算法》
固定窗口算法
简介
固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个单位时间的固定窗口,随后再去限制这些固定窗口所能接收的请求数量。固定窗口算法通常在实现时会使用计数器去统计单位时间内已接收的请求总数,而一旦请求数量在下个固定窗口到来前到达阈值,那么系统就会拒绝掉后续的所有请求,直至下个固定窗口到来为止。
场景
- 限制网络带宽:控制访问流量;
- 功能分级:为不同级别的用户提供不同频率的服务,通过控制单位时间内最大访问数量的方式;
- 任务调度:限制任务执行频率以避免资源争用。
概念
- 计数器:一个简单的次数统计,通常使用Redis一类的中间件实现。
流程
- 系统每隔单位时间(通常是1s)的去清空计数器;
- 客户端访问系统,在网关被拦截。随后网关会判断当前请求是否免限流,是则直接访问;
- 如果当前请求不免限流,则网关会判断当前固定窗口接收的请求总数是否已达阈值,是则拒绝当前请求;否则允许当前请求访问系统。
缺点
无法限制请求的访问频率。固定窗口算法只能限制请求在单位时间内的整体数量,但却无法限制请求在单位时间内的整体频率,即请求可能不会均匀的散布在单位时间中,而是会在两个单位时间的起/终点处集中发生,并因此边界原因而出现超频问题。
以每秒50个请求的限制为例,这50个请求可能不会均匀散落于1s的单位时间中,而是集中在终点的0.1 ~ 0.2秒内发生。此时如果下个单位时间的50个请求也集中在起点的0.1 ~ 0.2秒内发生,那么就违背了固定窗口算法在单位时间内不允许请求总数超过阈值的规定。
滑动窗口算法
滑动窗口算法是固定窗口算法的优化版本,用于解决固定窗口算法的边界超频问题。滑动窗口算法与固定窗口算法的核心差异在于其将系统生命周期的时间分段由原本的绝对分段改为了以当前时刻为基点的相对分段,即系统统计的永远都是当前时刻所在单位时间内的请求数量。因此与固定窗口算法一个单位时间就是一个窗口不同,滑动窗口算法永远只有一个窗口,并且该窗口还会随着时间的推移而移动,这也是滑动窗口算法的名称由来。那么当前时刻具体又处于单位时间的那个位置呢?事实上滑动窗口算法会对单位时间进行更加细致的划分,例如将1s的单位时间划分为5个0.2s的区间,并为每个区间分配独立的计数器来追求更加平滑的限流效果,因此当前时刻必然会位于单位时间的最后一个区间划分上。
流程
- 系统每隔区间时段便滑动一个区间;
- 客户端访问系统,在网关被拦截。随后网关会判断当前请求是否免限流,是则直接访问;
- 如果当前请求不免限流,则网关会判断滑动窗口的单位时间内所有区间计数器统计的请求总数“和”是否已达阈值,是则拒绝当前请求;否则允许当前请求访问系统。
- 上述流程可以大幅降低边界超频问题的发生概率。依然以每秒50个请求的限制为例:如果系统在1.0 ~ 1.8区间内未曾收到任何请求,但在1.8 ~ 2.0区间内却集中接收了50个请求,那么整个单位时间内可接收的请求总数实际便已达到上限。这种情况下如果在2.0 ~ 2.2区间里又有50个请求访问系统,那么在固定窗口算法中是不会触发限流的,但是在滑动窗口算法中由于滑动窗口会剔除尾部/新增头部的1.0 ~ 1.2/2.0 ~ 2.2区间,因此整个单位时间所允许的请求数量依然达到了上限,因此是会触发限流的。而理论上只要区间划分的足够细致,那么最终的限流效果就越平滑,即边界超频的发生概率就越小。
相关文章:

分布式 窗口算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & 窗口算法 & 总结》《分布式 & 窗口算法 & 问题》 参考文献 《【算法】令牌桶算法》 固定窗口算法 简介 固定窗口算法是最简单的流量控制算法。固定窗口算法的核心原理是将系统的生命周期划分为一个个…...
docker容器内部启动jupyter notebook但是宿主机无法访问的解决方法
目录 1.问题2.解决方法 1.问题 在docker容器内启动了jupyter notebook,在宿主机内用如下的url无法访问 http://localhost:8888 http://127.0.0.1:8888 启动方法: jupyter notebook 2.解决方法 启动方法加上选项[ --ip‘*’]或者[–ip‘0.0.0.0’] 即启…...
2.2 数据库设计方法
数据库设计流程: 1.需求分析:准确了解分析用户需求(包括数据与处理)。需求分析是整个设计过程的基础,需求分析决定了构建数据库大厦的速度和质量 2.概念结构设计:概设结构设计是整个数据库设计的关键&…...

ALOHA 协议详解
注:本文为 “ALOHA 协议” 相关文章合辑。 未去重整理。 动态分配信道(ALOHA 协议、CSMA 协议) QuantumYou 于 2021-07-27 09:32:04 发布 ALOHA 协议 纯 ALOHA 协议 -纯 ALOHA 协议思想:不监听信道,不按时间槽发送…...
Quant connect的优势和不足,学习曲线难
Quant connect的优势和不足 Quant connect作为一个成熟的算法交易平台,具有许多优势,包括: 强大的回测功能:Quant connect提供了丰富的数据源和回测功能,可以对各种交易策略进行全面的回测和分析。 容易上手…...

分布式 漏桶算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & 漏桶算法 & 总结》《分布式 & 漏桶算法 & 问题》 概述 简介 LBA Leaky Bucket Algorithm 漏桶算法是一种流行于网络通信领域的流量控制/频率限制算法。漏桶算法的核心原理是通过一个概念上的“漏桶”来…...

2450.学习周刊-2024年50周
封面 人生五个球 ✍优秀博文 面对老板安排的工作,事事有回应,有必要吗? 职场精英进阶手册:工作推进五原则,让你合理高效地利用时间 上个班而已,千万别畏手畏脚 理解了雷军说的SU7要守正出奇࿰…...
前端性能优化实战:从加载到渲染的全链路提升
"这个页面怎么这么慢啊?" 产品经理小李站在我的工位旁,指着屏幕上的数据大屏抱怨道。我打开 Chrome DevTools 看了一眼,首屏加载时间确实有点吓人 - 足足用了 8 秒。作为一个追求极致体验的前端开发者,这个数字让我坐不住了。 回想起上周的性能检测会议,…...
pdf merge
在 Ubuntu 22.04 上,你可以使用以下命令行工具来合并多个 PDF 文件: 1. pdftk pdftk 是一个强大的 PDF 工具,支持合并、拆分和其他操作。安装和使用方法如下: sudo apt install pdftk pdftk file1.pdf file2.pdf cat output me…...

Python高性能web框架-FastApi教程:(3)路径操作装饰器方法的参数
路径操作装饰器方法的参数 1. 定义带有参数的POST请求路由 app.post(/items,tags[这是items测试接口],summary这是items测试的summary,description这是items测试的description,response_description这是items测试的response_description) def test():return {items: items数据…...

怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文引用怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev 在 vscode 设置项中配置 gopls 的 ui.navigation.importShortcut 为 Definition 即可。 "gopls": {"ui.navigation.importShortcut": "Definition" }ui.navigation.i…...

bean创建源码
去字节面试,直接让人出门左拐:Bean 生命周期都不知道! spring启动创建bean流程 下面就接上了 bean生命周期 doGetBean Object sharedInstance this.getSingleton(beanName); sharedInstance this.getSingleton(beanName, new ObjectF…...
axfbinhexelf文件区别
0 Preface/Foreword axf,bin,hex,elf四个都能存在于嵌入式软件领域。 1 文件介绍 嵌入式软件中常见的文件包含: axf,包含调试信息,文件最大。调试信息放在机器码前面。elfhex,包含地址信息,文件内容较大。bin&#x…...
ABAP时间戳与日期时间转换及时区处理
一、时间戳转换为日期时间 1. 基本转换 CONVERT TIME STAMP <fs_back>-lastchangedatetime TIME ZONE sy-zonloINTO DATE DATA(lv_date)TIME DATA(lv_time).2. 解决8小时时差问题的方案 方案1:直接使用UTC时区(推荐) CONVERT TIME …...

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍01
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
Flink是什么?Flink技术介绍
官方参考资料:Apache Flink — Stateful Computations over Data Streams | Apache Flink Flink是一个分布式流处理和批处理计算框架,具有高性能、容错性和灵活性。以下是关于Flink技术的详细介绍: 一、Flink概述 定义:Fli…...

DETR-ResNet-50:Facebook的革命性目标检测模型
在计算机视觉领域,DETR(DEtection TRansformer)模型,由Facebook推出,已成为一项具有革命性的技术。DETR-ResNet-50作为一种结合了Transformer和ResNet-50骨干网络的端到端目标检测模型,凭借其出色的性能和创…...

0002.基于springboot +layui二手物品交易平台
适合初学同学练手项目,部署简单,代码简洁清晰; 注:当前项目架构使用前后端未分离哦! 一、系统架构 前端:layui| html 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven 二、代…...

【游戏设计原理】7 - 加德纳的多元智能理论
虽然多元智能理论是对认知方式的分类,但它也可以为游戏设计提供丰富的思路和策略,帮助设计师创建更具吸引力、包容性和多样性的游戏。通过理解不同玩家的认知方式和优势,我们可以更精准地设计游戏的元素和玩法,使其能够吸引广泛的…...

React Image Crop——在React应用中轻松实现图片裁剪功能
React Image Crop是一个用于在React应用程序中裁剪和调整图像的库。它提供了一个简单而强大的界面,允许用户选择和调整裁剪区域,并生成裁剪后的图像。 什么是React Image Crop? React Image Crop是一个开源的React组件,用于在浏览…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...