1 何谓限流

限流,顾名思义,便是限制流量的意思。系统规定在一段时间内只能进入这么多的流量,如果超过限额的话,那就不好意思了,我这个系统接受不了。通过限流算法,我们可以控制系统的 qps,更好地对系统提供保护。

本文致力于介绍几种我们常用的限流算法,同时会对其原理进行一定程度的剖析,希望大家能有所收获。

2 计数器算法

算法原理

计数器算法是最简单的限流算法,假设我们规定 A 接口在1小时之内的访问次数不能超过1000次,我们可以在开始时设置一个计数器,只有有一个请求进来,计数器的值就加一。如果计数器的值大于1000,而且该次请求与第一次请求的间隔时间小于1小时,说明请求过多,需要执行拒绝策略;如果该次请求与第一次请求的间隔时间大于1小时,直接重置计数器即可。

存在的问题

该算法虽然比较简单,但是存在一个临界问题。

假设存在一个恶意用户,在第一个小时的最后一秒发送了1000个请求,又在第二个小时的第一秒再次发送了1000个请求,通过在时间窗口的重置节点处突发请求,瞬间超过我们的速率限制。恶意用户可能通过这个算法的漏洞,在一个较短的时间内制造大量的流量,来压垮我们的应用。

实现方法

使用 redis 的 incr 原子自增性。

3 滑动窗口算法

算法原理

计数器算法由于其存在的临界问题,统计的精度过低,可能在时间窗口的重置节点处接收大量流量,为解决这个问题,我们引入了滑动窗口算法。

我们依然使用上面的例子,把一个时间窗口设置为1小时,然后我们再对时间窗口进行划分。例如,我们把时间窗口划分为60格,即每一分钟代表一格,每过一分钟,时间窗口都会往右滑动一格,每一格都有自己的计数器。

对临界问题的解决

我们上面探讨过这个一个情节,一个恶意用户在第一个小时的最后一秒发送了1000个请求,又在第二个小时的第一秒再次发送了1000个请求。在滑动窗口算法中,最后一秒到达的1000个请求会在一个格子中,第一秒到达的1000的请求会在一个格子中,当新的一分钟到来时,时间窗口会向右移动一格,时间窗口的总请求数量一定超标(因为时间窗口包括了最近的这两个格子,这时至少有2000个请求),所以触发限流操作。

计数器算法其实就是只有一格的滑动窗口算法,当滑动窗口算法的格子划分越多,限流的统计就越精确。

4 令牌桶算法

请求在被处理之前,需要首先获取一个令牌,才能执行接下来的业务逻辑,处理完业务逻辑需要将令牌删除。令牌桶是一个存放令牌的地方,它会根据限流大小,会按照一定的速率向桶中添加令牌。

令牌桶会设置最大的放置令牌限制,当令牌桶满了,新添加的令牌会被直接丢弃;令牌桶也有最低限额,当令牌数到达最低限额时,请求处理完之后将不会删除令牌。

5 漏桶算法

所谓漏桶,顾名思义,便是一个漏水的桶,我们往这个桶加水的速率可能是任意的,但桶漏水的速度是必然恒定的。如果流入水的速率过快,已经超过桶的容量大小,那水便会直接流出(被丢弃)。漏桶算法便是在此基础上设计的。

所谓漏桶算法,便是当访问请求到达时,直接放置进入漏桶,如漏桶当前容量已到达限流上限,则触发限流策略。漏桶会以固定的速率释放访问请求,直到漏桶为空。

6 聊聊令牌桶算法与漏桶算法的区别

漏桶算法可以限制数据的平均传输速率,而令牌桶算法除了能够限制数据的平均传输速率外,还能够允许某种程度的突发传输。因为在令牌桶算法中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,所以它适合于具有突发特性的流量。

参考:三种常见的限流算法

常见的限流算法及其原理剖析相关推荐

  1. 常见的限流算法的原理以及优缺点

    原文网址:常见的限流算法的原理以及优缺点_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍限流常用的算法及其优缺点. 常用的限流算法有: 计数器(固定窗口)算法 滑动窗口算法 漏桶算法 令牌桶算 ...

  2. 常见的限流算法与实现

    限流的实现 常见的限流算法: 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机. 常见的限流算法有三种: 计数器限流(固定窗口) 原理: 时间 ...

  3. 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?

    什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...

  4. 你知道常见的限流算法有哪些吗?

    我们常见的限流算法有四种:计数器(固定窗口)算法.滑动窗口算法.漏桶算法.令牌桶算法. 为什么要限流 资源是有限的,我们的系统的处理能力也是有限的,对于那些已经超出系统处理能力的请求我们应该尽可能早的 ...

  5. java中常见的限流算法详细解析

    目录 前言 1. 验证限流以及容器限流 2. 服务端限流 2.1 固定时间窗口 2.2 滑动时间窗口 2.3 漏桶算法 2.4 令牌桶算法 前言 以下的文章参考了一些具体的资料加深了解 B站:Java ...

  6. 常见的限流算法和应用场景

    1.计数器模式 假设以1分钟作为一个固定窗口,窗口流量限制为100.那么1分钟的最后1s进来100个流量,下一个窗口的第一秒进来了100个流量,其实1分钟内流量是超出系统能承受范围的. 所以,计数器模 ...

  7. 常见的几种限流算法代码实现(JAVA)

    最近在学习Sentinel组件需要了解限流算法相关的知识,正好在微信公众号上看到了一篇不错的文章,在此记录一下以下是原文链接. 年轻人,来手撸几种常见的限流算法! 限流算法接口 public inte ...

  8. 【云原生】服务限流熔断概述、常见限流算法

    文章目录 1.服务雪崩 1)服务熔断 2)服务降级 3)服务熔断降级的几种常见方案 1> 平均响应时间 2> 异常比例 3> 异常数量 2.限流概述 1)为什么要有限流? 2)DDo ...

  9. 搞懂限流算法这一篇就够了

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 TL;DR(too long don't read) 限流算法:计 ...

最新文章

  1. 图像处理与机器学习(验证码的识别)
  2. springmvc java中转发_Springmvc中的转发重定向和拦截器的示例
  3. 产业|嵌入式传感器将是未来机器人等技术增长的核心
  4. 花匠(东方化改题+无题解)
  5. 网站用sqlite库,报attempt to write a readonly database,解决方法
  6. formidable处理提交的表单或文件的简单介绍
  7. 用香港服务器建收费网站,使用香港站群服务器搭建网站的好处有哪些?
  8. FAQ系列 | 几种常见MySQL无法启动案例
  9. 使用 ES6 的浏览器兼容性问题
  10. 数据相关的在职研究生_一流大学在职研究生,与一般大学全日制研究生,哪个含金量高?...
  11. python优秀源码新闻系统_[内附完整源码和文档] 基于python的新闻检索系统
  12. StringUtil和StringUtils的区别
  13. python是一门胶水语言_Python是唯一被称为“胶水语言”的编程语言?事实并非如此!...
  14. SAP采购计划协议(SA)中的计划行统计清单
  15. 中国Linux杰出人物
  16. 微信小程序:好玩的表情包机器人
  17. 小红书【服饰穿搭】有多火?2022年种草笔记超125万
  18. 利用VBA在Word中排出漂亮的代码
  19. android最新主流机型,就要Android 市售主流机型随你挑
  20. 汇编实验2.4 查找电话号码phone

热门文章

  1. mongoDB中聚合(aggregate)的具体使用
  2. 关于小米2S从MIUI7降级和recovery的绕路之旅
  3. Spring 的表头
  4. 2021年全球热流道控制器收入大约671.9百万美元,预计2028年达到1126.1百万美元
  5. Vue3中自定义ref
  6. Kotlin 集合函数锦集
  7. python gpu并行计算_【Python - GPU】基于Python的GPU加速并行计算 -- pyCUDA
  8. python并行计算|pycuda测试、对比及分析
  9. 返利指定服务器,忘川风华录返利指定服务器是什么意思,返利指定服务器领取方法...
  10. 写一个块设备驱动5,6(转)