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

news2024/12/25 23:59:49

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

文章目录

  • 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://www.coloradmin.cn/o/1308156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式详解---观察者模式

1. 观察者模式简介 1.1. 什么是观察者模式 观察者模式是一种行为型设计模式,用于建立对象之间的一对多依赖关系。在该模式中,一个被称为主题(Subject)的对象维护一组观察者(Observer),并在其状…

Kafka-快速实战

Kafka介绍 ChatGPT对于Apache Kafka的介绍: Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐…

前端-杂记

1 子域请求时候会默认带上父域下的Coolkie 2 document.cookie 设置cookie只能设置当前域和父域,且path只能是当前页或者/ 比如当前页面地址为 http://localhost:3000/about 我们设置 document.cookie "demo11"; 设置 document.cookie "demo22; …

7.25 SpringBoot项目实战【我的借阅记录】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 至此,我们已经实现 图书借阅、收藏、评论等场景,最后来到【还书】场景,首先 还书的 入口 一般 是【我的借阅记录】,在这里可以根据产品设计,对于需要归还的书 操作【还书】,所以本文来实现【我的借阅记录】。…

基于ssm医院住院综合服务管理系统设计与开发论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对医院住院信息管理混乱,出错率高,信息安全性差…

网站高性能架构设计——高性能数据库集群

从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、高性能数据库简介 1.高性能数据库方式 读写分离:将访问压力分散到集群中的多个节点,没有分散存储压力 分库分表&…

【unity】如何用Unity获取Windows桌面

【背景】 默认的Unity可实现的屏幕共享仅仅针对Unity编辑器的编辑窗口中的Camera展现的内容。本篇研究如何实现用Unity实时反映Windows桌面窗口画面。 【准备插件】 下载地址: https://download.csdn.net/download/weixin_41697242/88623496 将解压后的文件夹直…

排序算法之一:直接插入排序

1.基本思想 直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 实际中我们玩扑克牌时,就用…

【AI】java,在集合中找最接近给定值的数,且比给定值小

目录 一、最终得到的方案 二、AI辅助找到方案 2.1 【C知道】提供java代码支持 2.2 【文心一言】提供字段翻译支持 一、最终得到的方案 /*** 在 collection 中,找跟 value 最大接近值,且该值小于等于 value** param collection 不为null。* param val…

css 纯样式实现绘出进度条

效果: css代码: .bar{height: 14px;width: 100%;font-size: 10px;margin-top: 5px;background-color: #f5f5f5;}.bar::before{display: block;counter-reset: progress var(--precent); content: ;width: calc(1% * var(--precent));color: #fff;height:…

酸奶店创业新模式,可以轻松应付风险的对策

本人经营一家酸奶店,已经5年时间,也不断学习和探索新的模式,希望我的一些经验可以帮到你。(可以点赞收藏,方便以后随时查阅) 这几年,各行各业,大家都在说,生意不好做&am…

Qt设置类似于qq登录页面(ikun)

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QWindow> #include <QIcon> #include <QLabel> #include <QMovie> #include <QLineEdit> #include <QPushButton>QT_BEGIN_NAMESPACE namespace Ui { class…

jemeter,断言:响应断言、Json断言

一、响应断言 接口A请求正常返回值如下&#xff1a; {"status": 10013, "message": "user sign timeout"} 在该接口下创建【响应断言】元件&#xff0c;配置如下&#xff1a; 若断言成功&#xff0c;则查看结果树的接口显示绿色&#xff0c;若…

新版Spring Security6.2案例 - Basic HTTP Authentication

前言&#xff1a; 书接上文&#xff0c;翻译官网Authentication的Username/Password这页&#xff0c;接下来继续翻译basic的这页&#xff0c;因为官网说的都是原理性的&#xff0c;这边一个小案例关于basic http authentication。 Basic Authentication 本节介绍 HTTP 基本身…

C语言union联合体(共用体)

一、定义 联合体&#xff08;共用体&#xff09;是一种特殊的自定义的数据类型&#xff0c;它包含一系列的成员变量&#xff0c;这些成员变量共用一块内存空间。 语法&#xff1a; union 标识符 { data_type 标识符1; data_type 标识符2; . . . dat…

电影推荐系统

基于springboot vue实现的电影推荐系统&#xff0c;通过Jsoup数据爬取。 效果图如下&#xff1a;

Java01 169-184

数组添加 import java.util.Scanner; public class ArrayAdd02 {public static void main(String[] args) {Scanner myScanner new Scanner(System.in);//数组一旦定义&#xff0c;不可以增加&#xff0c;必须增加新的数组int[] arr {1, 2, 3};do {int[] arrNew new int[arr…

2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【G3锅炉水处理】免费试题及G3锅炉水处理模拟试题&#xff0c;包含G3锅炉水处理免费试题答案和解析及G3锅炉水处理模拟试题练习。安全生产模拟考试一点通结合国家G3锅炉水处理考试最新大纲及G3锅炉水处理考试真…

目标检测DOTA数据集提取感兴趣类别数据

DOTA数据集 DOTA数据集包含2806张航空图像&#xff0c;尺寸大约从800x800到4000x4000不等&#xff0c;包含15个类别共计188282个实例。其标注方式为四点确定的任意形状和方向的四边形&#xff08;区别于传统的对边平行bbox&#xff09;。类别分别为&#xff1a;plane, ship, s…

20、备忘录模式(Memento Pattern,不常用)

备忘录模式又叫作快照模式&#xff0c;该模式将当前对象的内部状态保存到备忘录中&#xff0c;以便在需要时能将该对象的状态恢复到原先保存的状态。 备忘录模式提供了一种保存和恢复状态的机制&#xff0c;常用于快照的记录和状态的存储&#xff0c;在系统发生故障或数据发生…