当前位置: 首页 > news >正文

限流算法思想

固定窗口计数器算法

其原理是将时间划分为固定大小的窗口,在每个窗口内限制请求的数量或速率,即固定窗口计数器算法规定了系统单位时间处理的请求数量

优点:实现简单,易于理解

缺点:1.限流不够平滑 2.无法保证限流速率,因而无法应对突然激增的流量。(例如大量请求集中在某1S)

滑动串口计数器算法

滑动窗口计数器算法 算的上是固定窗口计数器算法的升级版,限流的颗粒度更小。它把时间以一定比例分片 。例如我们的接口限流每分钟处理 60 个请求,我们可以把 1 分钟分为 60 个窗口。每隔 1 秒移动一次,每个窗口一秒只能处理不大于 60(请求数)/60(窗口数) 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。

很显然, 当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。

优点:1.相比固定窗口,可以应对突然激增的流量 2.相比固定窗口,颗粒度更小,可以实现限流更精确的控制

缺点:1.依然存在不够平滑的问题 2.实现和理解更复杂

漏桶算法

我们往桶中以任意速率流入水,以一定速率流出水。当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。具体实现可以准备一个队列用来保存请求,然后我们定期从队列中拿请求来执行就好了(和消息队列削峰/限流的思想是一样的)

优点:1.实现简单易理解 2.可以控制限流速率,避免网络拥塞和系统过载

缺点:1.无法应对突然激增的流量,对系统资源利用不友好 2.如果发请求(桶流入的速率)一直大于桶流出,会丢失大量请求,导致服务质量下降

令牌桶算法

桶中装的是令牌,以一定的速率生成令牌,桶满了,就不能添加令牌了,到来的请求需要在桶中取令牌,取不到令牌的任务会被丢弃。

优点:1.可以限制平均速率和应对突然激增的流量 2.可以动态调整生成令牌的速率

缺点:1.令牌生产速率不合理,可能会有大量请求被丢弃,系统过载 2.实现理解也复杂一些

  • 实现方案:Guava RateLimiter限流
  • Guava RateLimiter是一个谷歌提供的限流,其基于令牌桶算法,比较适用于单实例的系统。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HarmonyOS 开发
  • Simple RPC - 04 从零开始设计一个客户端(上)
  • 用Python爬取高德地图路径规划数据——02. 批量爬取-Python程序及详解
  • PostgreSQL的Logical Replication Launcher进程
  • Lumos学习王佩丰Excel第十二讲:Match与Index
  • 【PyCharm】配置“清华镜像”地址
  • Educational Codeforces Round 169 (Rated for Div. 2)(A-D)
  • 深度学习--参数报错问题
  • 网络硬盘录像机NVR解決方案:海思3520D模组与全面的NVR方案支持
  • 【信息学奥赛一本通】1007:计算(a+b)×c的值
  • Unity3D 自定义窗口
  • HiveSQL:提取json串内容——get_json_oject和json_tuple
  • Go Roadmap-Basics中文笔记
  • 类与对象(中(1))
  • 【文献阅读】A Comprehensive Review of Multimodal Large Language Models
  • [Vue CLI 3] 配置解析之 css.extract
  • [数据结构]链表的实现在PHP中
  • 4. 路由到控制器 - Laravel从零开始教程
  • Java多线程(4):使用线程池执行定时任务
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python socket服务器端、客户端传送信息
  • Zsh 开发指南(第十四篇 文件读写)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 给github项目添加CI badge
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 简单实现一个textarea自适应高度
  • 排序(1):冒泡排序
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 学习ES6 变量的解构赋值
  • 学习HTTP相关知识笔记
  • 云大使推广中的常见热门问题
  • scrapy中间件源码分析及常用中间件大全
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • #nginx配置案例
  • #QT(串口助手-界面)
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (day6) 319. 灯泡开关
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (纯JS)图片裁剪
  • (七)glDrawArry绘制
  • (三)模仿学习-Action数据的模仿
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (五)Python 垃圾回收机制
  • (转)Oracle存储过程编写经验和优化措施
  • ./configure,make,make install的作用(转)
  • .NET 通过系统影子账户实现权限维持
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net中应用SQL缓存(实例使用)
  • .net专家(张羿专栏)
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @Pointcut 使用
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ C++ ] template 模板进阶 (特化,分离编译)