微服务--07--Sentienl中使用的限流算法

news/2024/7/7 19:13:01

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • Sentienl中使用的限流算法
    • 1、计数器固定窗口算法
    • 2、计数器滑动窗口算法----(默认)
    • 3、漏桶算法----(排队等待)
    • 4、令牌桶算法----(WarmUp预热)
  • Sentinel对应有哪些流控效果?
    • 1.快速失败(默认)
        • 算法:滑动窗口
    • 2.Warm Up(预热)
        • 算法:令牌桶
    • 3.排队等待
        • 算法:漏桶算法


Sentienl中使用的限流算法

  • 计数器固定窗口算法
  • 计数器滑动窗口算法
  • 漏桶算法
  • 令牌桶算法

1、计数器固定窗口算法

计数器固定窗口算法是最简单的限流算法,实现方式也比较简单。就是通过维护一个单位时间内的计数值,每当一个请求通过时,就将计数值加1,当计数值超过预先设定的阈值时,就拒绝单位时间内的其他请求。如果单位时间已经结束,则将计数器清零,开启下一轮的计数。

image.png

但是这种实现会有一个问题,举个例子:

假设我们设定1s内允许通过的请求阈值是100,如果有用户在时间窗口的最后几毫秒发送了99个请求,紧接着又在下一个时间窗口开始时发送了99个请求,那么这个用户其实在一秒显然超过了阈值但并不会被限流。其实这就是临界值问题,那么临界值问题要怎么解决呢?

image.png

2、计数器滑动窗口算法----(默认)

计数器滑动窗口法就是为了解决上述固定窗口计数存在的问题而诞生。前面说了固定窗口存在临界值问题,要解决这种临界值问题,显然只用一个窗口是解决不了问题的。假设我们仍然设定1秒内允许通过的请求是200个,但是在这里我们需要把1秒的时间分成多格,假设分成5格(格数越多,流量过渡越平滑),每格窗口的时间大小是200毫秒,每过200毫秒,就将窗口向前移动一格。为了便于理解,可以看下图

image.png

图中将窗口划为5份,每个小窗口中的数字表示在这个窗口中请求数,所以通过观察上图,可知在当前时间块(200毫秒)允许通过的请求数应该是70而不是200(只要超过70就会被限流),因为我们最终统计请求数时是需要把当前窗口的值进行累加,进而得到当前请求数来判断是不是需要进行限流。

那么滑动窗口限流法是完美的吗?

image.png

细心观察的我们应该能马上发现问题,滑动窗口限流法其实就是计数器固定窗口算法的一个变种。流量的过渡是否平滑依赖于我们设置的窗口格数也就是统计时间间隔,格数越多,统计越精确,但是具体要分多少格我们也说不上来呀…

3、漏桶算法----(排队等待)

上面所介绍的两种算法都不能非常平滑的过渡,下面就是漏桶算法登场了

什么是漏桶算法?

漏桶算法以一个常量限制了出口流量速率,因此漏桶算法可以平滑突发的流量。其中漏桶作为流量容器我们可以看做一个FIFO的队列,当入口流量速率大于出口流量速率时,因为流量容器是有限的,当超出流量容器大小时,超出的流量会被丢弃。

下图比较形象的说明了漏桶算法的原理,其中水龙头是入口流量,漏桶是流量容器,匀速流出的水是出口流量。

image.png

漏桶算法的特点

  • 漏桶具有固定容量,出口流量速率是固定常量(流出请求)
  • 入口流量可以以任意速率流入到漏桶中(流入请求)
  • 如果入口流量超出了桶的容量,则流入流量会溢出(新请求被拒绝)

不过因为漏桶算法限制了流出速率是一个固定常量值,所以漏桶算法不支持出现突发流出流量。但是在实际情况下,流量往往是突发的。

4、令牌桶算法----(WarmUp预热)

令牌桶算法是漏桶算法的改进版,可以支持突发流量。不过与漏桶算法不同的是,令牌桶算法的漏桶中存放的是令牌而不是流量。

那么令牌桶算法是怎么突发流量的呢?

最开始,令牌桶是空的,我们以恒定速率往令牌桶里加入令牌,令牌桶被装满时,多余的令牌会被丢弃。当请求到来时,会先尝试从令牌桶获取令牌(相当于从令牌桶移除一个令牌),获取成功则请求被放行,获取失败则阻塞活拒绝请求。

image.png

令牌桶算法的特点

  • 最多可以存发b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃
  • 每当一个请求过来时,就会尝试从桶里移除一个令牌,如果没有令牌的话,请求无法通过。

令牌桶算法限制的是平均流量,因此其允许突发流量(只要令牌桶中有令牌,就不会被限流

Sentinel对应有哪些流控效果?

  • 快速失败(默认):计数器滑动窗口算法
  • WarmUp:令牌桶算法
  • 排队等待:漏斗算法
    在这里插入图片描述

1.快速失败(默认)

介绍:当QPS超过任意规定阈值就拒绝,FlowException

算法:滑动窗口

使用场景:对系统能力有确切已知的情况,比方我们进行压测

2.Warm Up(预热)

Warm Up(预热) 它从开始阈值到QPS阈值有一个缓冲阶段,一开始阈值最大是QPS的1/3 ,然后慢慢增长到最大阈值。

介绍:

image.png

算法:令牌桶

使用场景:在某些情况下,系统可能突然遭受大量请求压力,比如说 秒杀活动,广告投放。我们可以通过预热机制,可以提前组件增加系统的流量限制,以减轻系统的高峰期的压力

3.排队等待

介绍:让请求匀速的通过,单机阈值为每秒通过数量,其余的进行排队等待,他会有一个超时时间,当请求 超时image.png超过指定时间还没有处理,则丢弃

算法:漏桶算法

使用场景:

注意点:匀速排队模式暂时不支持qps > 1000场景


http://lihuaxi.xjx100.cn/news/1889725.html

相关文章

***Cpolar配置外网访问和Dashy

Dashy是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航页。一款功能超强大,颜值爆表的可定制专属导航页工具 结合cpolar内网工具,我们实现无需部署到公网服务器…

Editing Existing PDF Files in Java

Editing Existing PDF Files in Java 1. Overview In this article, we’ll see how to edit the content of an existing PDF file in Java. First, we’ll just add new content. Then, we’ll focus on removing or replacing some pre-existing content. 2. Adding the …

使用python的socketserver使服务器支持多客户端访问

1 背景 近期在做机器人集群的分布式控制,涉及到了机器人之间的交流工作,其中,每一台机器人都需要与多个机器人进行交流。 考虑使用python的socket来做,但简单测试了一下,socket模块不能方便的实现一个服务器与多客户…

基于QTreeWidget实现多级组织结构

基于QTreeWidget实现多级组织结构以及带Checkbox的选择树 采用基于QWidgetMingw实现的多级组织结构树 通过QTreeWidget控件实现的多级组织结构树。 Qt相关系列文章: 一、Qt实现的聊天画面消息气泡 二、基于QTreeWidget实现多级组织结构 三、基于QTreeWidget实现带Ch…

Flutter之Android Studio No connected devices found

看图1. 是有显示有Redmi虚拟机的。 看图2. 没有Redmi虚拟机可选择,继续往下看解决方案。 看图3.点开项目结构设置SDK确定。 看图4.它来了

案例:xpath实例+功能

素材&#xff1a;test.html 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Title</title></head><body><span>我爱你</span><ul><li…

数据结构:并查集的原理和运用

文章目录 什么是并查集&#xff1f;并查集的模拟实现并查集的应用省份数量等式方程的可满足性 本篇总结的是并查集的使用方法和运用 什么是并查集&#xff1f; 给定这样一个场景&#xff0c;n个不同的元素划分成不同的&#xff0c;不相交的集合&#xff0c;在开始的时候&…

sql server导出与导入

解决&#xff1a;不同版本sql server复制表、导数据&#xff1b;把数据库的结构和全部数据从2016版导入到2014版。 分离数据为mdf,ldf后&#xff0c;导入过程中无权限、被占用问题。 文章目录 使用脚本&#xff08;.sql文件&#xff09;导出导入备注 使用mdf&#xff0c;mlf导…