1. 限流场景

在开发高并发系统时,有很多种方法可用来保护系统:缓存、降级、限流等。

  • 缓存:提升系统访问速度,增大系统处理能力
  • 降级:服务出现问题或影响核心流程的性能时,需要暂时屏蔽,待高峰过去或问题解决后再打开
  • 限流:部分场景比如:稀缺资源(秒杀,抢购)、写服务(评论、下单)、频繁复杂查询(评论最后几页)等,需要限制这些场景的并发/请求量

限流就是通过对并发访问/请求进行限速或一个时间窗口内的请求进行限速,从而达到保护系统的目的。一般系统可以通过压测来预估能处理的峰值,一旦达到设定的峰值阀值,则可以拒绝服务(定向错误页或告知资源没有了)、排队或等待(例如:秒杀、评论、下单)、降级(返回默认数据)

限流不能乱用,否则正常流量会出现一些奇怪的问题,从而导致用户抱怨。

2. 限流算法

常见限流算法:技术器、令牌桶和漏桶算法。

2.1. 计数器

计数器是最简单粗暴的算法。例如:一个服务每秒能处理100个请求。设置一个1s的滑动窗口,窗口有10个格子,每个格子100ms,每100ms移动一次,每次移动都记录当前服务请求的次数。内存中保存最近10次的次数(LinkedList)。格子每次移动的时候判断一次,最后一个格子和第一个格子的次数是否相差100,如果超过,则进行限流。

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

计数器的实现简单,但是是平均分配1秒钟的请求,然而实际情况中的请求往往是动态的,流量不平滑的。

2.2. 令牌桶

令牌桶算法是一个存放固定容量令牌(token)的桶,按照固定速率往桶里添加令牌。令牌桶的主要概念如下:

  • 令牌按固定的速率被放入令牌桶中,例如:r tokens/秒
  • 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝
  • 当一个n字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上
  • 如果桶中的令牌不足n个,则不会删除令牌,且数据包将被限流(丢弃或在缓冲区等待)

令牌桶根据放令牌的速率(r tokens/s)去控制输出的速率(to network)

令牌桶的另外一个好处是可以方便的改变速度. 一旦需要提高速率,则按需提高放入桶中的令牌的速率. 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量.

2.3. 漏桶

漏桶( Leaky Bucket )算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。

漏桶作为计量工具时,可用于流量整形和流量控制,漏桶的主要概念如下:

  • 一个固定容量的漏桶,按照常量固定速率流出水滴(流出请求)
  • 如果桶是空的,则不需流出水滴
  • 可以以任意速率流入水滴到漏桶(流入请求)
  • 如果流入水滴超出了桶的容量,则流入的水滴溢出了(新流入的请求被拒绝),则漏桶容量是不变的

漏桶可以看做固定容量、固定流出速率的队列,漏桶限制的是请求的流出速率,漏桶中装的是请求

因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使流突发( burst )到端口速率.因此,漏桶算法对于存在突发特性的流量来说缺乏效率.

2.4. 令牌桶和漏桶的比较

令牌桶

漏桶

请求何时拒绝 固定速率往桶中添加令牌,如果桶中令牌不够,则拒绝新请求 流入请求速率任意,常量固定速率流出请求。当流入请求数积累到漏桶容量时,则拒绝新请求
速率限制 限制平均流入速率,允许一定程度的突发请求(支持一次拿多个令牌) 限制常量流出速率(流出速率是固定值),从而平滑突发流入速率

参考:

基于Redis的限流系统的设计

一个基于用户的API限流策略 Rate Limit相关推荐

  1. 设计一个基于用户的API限流策略 Rate Limit

    设计一个基于用户的API限流策略 Rate Limit 应用场景 API接口的流量控制策略:缓存.降级.限流.限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的.限流策略 ...

  2. 基于用户的API限流策略

    应用场景 API接口的流量控制策略:缓存.降级.限流.限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的.限流策略虽然降低了服务接口的访问频率和并发量,却换取服务接口和业 ...

  3. 算法高级(7)-限流(Rate limit)算法详解

    一.前言 保障服务稳定的三大利器:熔断降级.服务限流和故障模拟.今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流. 那么为什么需要限流呢? 按照 ...

  4. 秒杀限制人群,如何设计秒杀服务的限流策略?

    对于秒杀业务,大家应该比较熟悉了.比如,"某商品原价 1299 元, 双十一整点秒杀价仅 500 元,限量 100 件,先到先得" 等等.通过这段文案我们能够发现,参与秒杀活动商品 ...

  5. Java限流策略与算法

    概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃.此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待.排队. ...

  6. Java互联网架构-如何设计服务接口API限流功能

    API 概念的出现,远远早于个人计算机的诞生,更不用说网络的诞生了.在公用数据处理的早期,为了一个应用能够与其它系统交互,开发者便已开始设计可公开访问并描述清晰的"接入点".早在那 ...

  7. Kubernetes APIServer 限流策略

    之前说过了,认证,鉴权,准入,这三个重要的环节.到此为止k8s apiserver就已经将请求继续往后传递了,作为rest服务器,它一定要有自我保护机制,这个自我保护的机制最核心的就是限流. 作为we ...

  8. 探索常见的几种限流策略和实现

    高并发访问时,缓存.限流.降级往往是系统的利剑,在互联网蓬勃发展的时期,经常会面临因用户暴涨导致的请求不可用的情况,甚至引发连锁反映导致整个系统崩溃.这个时候常见的解决方案之一就是限流了,当请求达到一 ...

  9. 如何设计秒杀服务器的限流策略

    如果平时系统的访问量只有一万,而最大承受限制为五万,在秒杀时刻的瞬间,访问量突然增加到100W,此事系统一定会因访问量过大而宕机,此时就应该设计一个限流策略,使服务器能接收和处理的请求减少. 秒杀限流 ...

最新文章

  1. UVA 220 Othello
  2. PendingIntent与Intent区别
  3. CVPR 2021 involution:超越convolution和self-attention的神经网络新算子
  4. 「ProtocolBuffers2」ProtocolBuffers2 c++简易入门
  5. 数值方法:数值微分与数值积分
  6. canvas 插件_基于canvas的JavaScript 二维码生成工具——QRCanvas
  7. 83998 连接服务器出错_来申请一个阿里云服务器玩玩?
  8. python中rgb_python - 图像的RGB矩阵
  9. 国家和货币(符号/图片)数组(countries and currency symbol array)
  10. 在Web.config配置文件中自定义配置节点
  11. 拓端tecdat|R语言混合时间模型预测对时间序列进行点估计
  12. born to be wild---Bangkok篇
  13. html flash rtmp,Web直播之RTMP协议:vue-video-player + videojs-flash
  14. 计算机硬盘使用寿命,固态硬盘怎么测剩余寿命?SSD固态硬盘使用寿命检测方法...
  15. C++ Qt实现WPS、浏览器tab页面
  16. 这些那些非代码之罪的坑
  17. Vue实现 侧边固定定位图标 滑动隐藏
  18. SpringBoot接入Ueditor编辑器
  19. 论文浅尝 | 基于注意力图卷积神经网络的依存驱动关系抽取
  20. 如何在Mac上卸载软件?用这三种方法简单、干净、快速

热门文章

  1. CIKERS Shane 20190530
  2. Navicat使用教程:使用Navicat Premium 12自动执行数据库复制(四)
  3. 认识本质:黑天鹅、关键时刻与张小龙的产品观
  4. Myeclipse学习总结(8)——Eclipse实用操作
  5. 多列集合的索引器实现
  6. django学习笔记之forloop
  7. RED5 安装及问题
  8. 系统弹出菜单类名是固定的. #32769
  9. WPF-003 popup实现下拉列表的问题
  10. 10个最常见的数据库缺陷