常见限流算法解读

目录

前言

固定窗口(计算器法)

滑动窗口

漏桶算法 

令牌桶算法 

总结


前言

在现在的互联网系统中有很多业务场景,比如商品秒杀、下单、数据查询详情,其最大特点就是高并发,但是我们的系统通常不能承受这么大的流量,继而产生了很多的应对措施:消息队列、多级缓存、异地多活。但是无论如何优化,由于硬件的物理特性决定了我们系统性能的上限,如果强行接收所有请求,往往造成服务雪崩,导致服务的不可用,这个时候服务限流就成为我们必不可少的一个手段了。

服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,来避免瞬时的大量请求对系统造成负荷,来达到保护服务平稳运行的目的,常见的熔断组件有​​Hystrix,Nginx​​​跟阿里的​​Sentinel​​,以及Gateway采用的基于Redis实现的令牌桶算法。

QPS(TPS):每秒钟request/事务 数量

下面我会介绍常见的四种限流算法:

  • 固定窗口(计算器法)

  • 滑动窗口

  • 漏桶算法

  • 令牌桶算法

固定窗口(计算器法)

计算器法算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略。下一个周期开始时,进行清零,重新计数。

比如限流设定为1s内3次,那么每次收到请求就计数加一,并判断这1s内计数是否大于上限3,没超过上限就返回成功,否则返回失败。

这个算法的缺点就是在时间临界点如果会有较大瞬间流量,不能达到我们预期的限流算法

假设1s内服务器的负载能力为3,因此一个周期的访问量限制在3,然而在第一个周期的最后0.5秒和下一个周期的开始0.5秒时间段内,分别涌入2个访问量,虽然没有超过每个周期的限制量,但是整体上1秒内已达到4个访问量,已远远超过服务器的负载能力,由此可见,计数器算法方式限流对于周期比较长的限流,存在很大的弊端,如下图所示:

滑动窗口

滑动窗口算法解决固定窗口临界值的问题。它将单位时间周期分为n个小周期,分别记录每个小周期内接口的访问次数,并且根据时间滑动删除过期的小周期。

我们将时间间隔均匀分隔,比如将1S分为个0.5秒,每一个0.5秒内单独计数,总的数量限制为这2个0.5秒的总和,我们把这2个0.5秒成为“窗口”。

那么每过0.5秒,窗口往前滑动一步,数量限制变为新的2个0.5秒的总和,如图所示: 

那么如果在临界时,收到4个请求,就会进行限流

接着窗口进行滑动

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

漏桶算法 

漏桶算法其实很简单,可以粗略的认为就是注水漏水过程,往桶中以一定速率流出水,以任意速率流入水,当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。

假设桶的容量为4,现在每秒有5个请求进来 ,而桶的流速为1s流出2个请求。

 第一秒的情况如下

第二秒时也就会有4个请求会被丢弃

假设你的漏桶出口固定了每秒钟只能通过100个请求,如果此时有150个请求,无论你后方的系统能不能抗住这150个请求,通过漏桶算法都会将另外50个请求进行拦截,只能等前面的100个请求结束后才能继续放行剩下的50个请求,无法应对突发流量的来袭。

在算法实现方面,可以准备一个队列,用来保存请求,另外通过一个线程池定期从队列中获取请求并执行,可以一次性获取多个并发执行。

这种算法,在使用过后也存在弊端:无法应对短时间的突发流量

漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。

漏桶算法是一个匀速的执行,令牌桶支持突发以及预热,具体的需求看自己的需求吧。同时漏桶算法需要做溢出处理,而令牌桶不需要。

令牌桶算法 

令牌桶算法维护一个固定容量的令牌桶,每秒钟会向令牌桶放入一定数量的令牌。当有请求到来时,如果令牌桶中有足够的令牌,则请求被允许通过并从令牌桶中消耗一个令牌,如果令牌桶中没有令牌则会请求被拒绝。

 令牌桶中没有令牌,请求进来则会被拒绝即起到了限流。

令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。

 与漏桶算法相比,有可能导致短时间内的请求数上升(因为拿到令牌后,就可以访问接口,存在一瞬间将所有令牌拿走的情况),但不会有计数算法那样高的峰值(因为令牌数量是匀速增加的)。所以在应对突发流量的时候令牌桶表现的更佳。

总结

  • 令牌桶、漏桶算法更适合阻塞式限流的场景,即后台任务类的限流。
  • 而基于时间窗口的限流则更适合互联网实施业务限流的场景,即能处理快速处理,不能处理及时响应调用方,避免请求出现过长的等待时间。

Gateway则采用了基于Redis实现的令牌桶算法,而Sentinel内部却比较复杂:

- 默认限流模式是基于滑动时间窗口算法
- 排队等待的限流模式则基于漏桶算法
- 而热点参数限流则是基于令牌桶算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176874.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 requests.post 数据字段编码问题的方法

问题背景 在进行网络请求时,我们通常会使用requests库的post方法来发送POST请求。然而,当我们尝试发送包含特殊字符(如中文字符)的数据时,可能会遇到数据字段被编码的问题。这可能会导致请求失败或者服务器无法正确解…

Ubuntu环境下为串口设置别名

本文介绍Ubuntu环境下为串口设置别名。 Ubuntu环境下,有时候开发调试会使用到USB转串口,本文介绍在不同使用场景下为串口设置别名的方法。主要分为绑定设备ID和绑定USB端口号。 1.绑定设备ID 绑定设备ID适用于USB转串口的设备ID唯一的情况&#xff0c…

基于安卓android微信小程序的快递取件及上门服务系统

项目介绍 本文从管理员、用户的功能要求出发,快递取件及上门服务中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、快递下单管理、预约管理、管理员管理、系统管理、订单管理,用户客户端;首页、快递下单、预约管理…

台球厅 计时计费系统怎么弄教程,佳易王桌球计时计费系统灯控设置教程

台球厅 计时计费系统怎么弄教程,佳易王桌球计时计费系统灯控设置教程 佳易王桌球计时计费软件灯控器与软件配套,灯控连接设置只需设置端口即可。点击左上角系统参数设置 找到 控制器端口设置,点击打开 选择相应的端口保存即可,这…

java创造对象

java创造对象主要分为以下几个步骤 获取对应的类,查看是否加载,如果没有加载把类进行加载根据类的信息可以直接获取到实例的大小,分配对应内存调用实例的方法 比如说 class bb implements Serializable {private String bb; }class aa ext…

mmdetection安装与训练

一、什么是mmdetection 商汤科技(2018 COCO 目标检测挑战赛冠军)和香港中文大学最近开源了一个基于Pytorch实现的深度学习目标检测工具箱mmdetection,支持Faster-RCNN,Mask-RCNN,Fast-RCNN等主流的目标检测框架&#…

Ubuntu 安装常见问题

1. 安装oh my zsh 搜狗输入法不能用 vim /etc/environmentexport XIM_PROGRAMfcitx export XIMfcitx export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERS“imfcitx” export LANG“zh_CN.UTF-8”配置完后重启,稍等一会,右上角会有个…

RT-Thread STM32F407 DMA

这里以串口的DMA方式接收为例,串口1进行调试,串口2进行DMA接收 第一步,进入RT-Thread Settings配置DMA 第二步,进入board.h,定义串口及DMA宏 第三步,回到main.c,配置串口及DMA模式 第四步…

css:文本对齐属性vertical-align实现化学元素上标下标的显示

文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/vertical-align 语法 vertical-align: <value>;可选值&#xff1a; sub&#xff1a;使元素的基线与父元素的下标基线对齐。 super&#xff1a;使元素的基线与父元素的上标基线对齐。 text-top&#xff1a;使…

将ECharts图表插入到Word文档中

文章目录 在后端调用JS代码准备ECharts库生成Word文档项目地址库封装本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图片&#xff0c;然后插入到Word文档中&#xff1f; 首先要解决一个问题&#xff1a;总所周知&#xff0c;ECharts是前端的一个图表库…

全彩LED显示屏的质量怎样判断

判断全彩LED显示屏的质量需要考虑多个方面&#xff0c;包括平整度、白平衡、可视角度、分辨率、亮度、可靠性和稳定性等。以下是一些建议&#xff0c;供你参考&#xff1a; 平整度&#xff1a;LED显示屏的表面平整度应在1mm以内&#xff0c;以保证显示图像不发生扭曲。局部凸起…

008.分隔符、循环、比较

1、字段分隔符与迭代器 内部字段分隔符&#xff08;Internal Field Separator&#xff0c;IFS&#xff09;是shell脚本编程中的一个重要概念。在处理文本数据时&#xff0c;它的作用可不小。 作为分隔符&#xff0c;IFS有其特殊用途。它是一个环境变量&#xff0c;其中保存了…