限流常用算法以及基于Sentinel的微服务限流及熔断

一、服务限流的作用及实现

在没有任何保护机制的情况下,如果所有的流量都进入服务器,很可能造成服务器宕机导致整个系统不可用,从而造成巨大的损失。为了保证系统在这些场景中仍然能够稳定运行,就需要采取一定的系统保护策略,常见的策略有服务降级、限流和熔断等。

限流的主要目的是通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,一旦达到限制数量则对当前请求进行处理采取对应的拒绝策略,比如跳转到错误页面拒绝请求、进入排队系统、降级等。从本质上来说,限流的主要作用是损失一部分用户的可用性,为大部分用户提供稳定可靠的服务

在实际开发过程中,限流几乎无处不在

  • 在Nginx层添加限流模块限制平均访问速度
  • 通过设置数据库连接池、线程池的大小来限制总的并发数
  • 通过Guava提供的Ratelimiter限制接口的访问速度
  • TCP通信协议中的流量整形要实现限流,最重要的就是限流的算法,下面简单来讲解一下常见的限流实现算法

二 、常见的限流算法

2.1计数器算法

计数器算法是一种比较简单的限流实现算法,在指定周期内累加访问次数,当访问次数达到设定的闻值时触发限流策略,当进入下一个时间周期时进行访问次数的清零

在这里插入图片描述
如图7-2所示,限定了每一分钟能够处理的总的请求数为100,在第一个一分钟内,一共请求了60次。接着到第二个一分钟,counter又从0开始计数,在一分半钟时,已经达到了最大限流的闯值,这个时候后续的所有请求都会被拒绝。这种算法可以用在短信发送的频次限制上,比如限制同一个用户一分钟之内触发短信发送的次数

这种算法存在一个临界问题,如图7-3所示,在第一分钟的0:58和第二分钟的1:02这个时间段内,分别出现了100个请求,整体来看就会出现4秒内总的请求量达到200,超出了设置的闻值

2.2 滑动窗口算法

为了解决计数器算法带来的临界问题,所以引入了滑动窗口算法。滑动窗口是一种流量控制技术,在TCP网络通信协议中,就采用了滑动窗口算法来解决网络拥塞的情况。

简单来说,滑动窗口算法的原理是在固定窗口中分割出多个小时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口。最终只需要统计滑动窗口范围内的所有小时间窗口总的计数即可。

如图7-4所示,我们将一分钟拆分为4个小时间窗口,每个小时间窗口最多能够处理25个请求。并且通过虚线框表示滑动窗口的大小(当前窗口的大小是2,也就是在这个窗口内最多能够处理50个请求)。同时滑动窗口会随着时间往前移动,比如前面15s结束之后,窗口会滑动到15s~45s这个范围,然后在新的窗口中重新统计数据。这种方式很好地解决了固定窗口算法的临界值问题。
Sentinel就是采用滑动窗口算法来实现限流的,后续在源码分析部分会再讲到

在这里插入图片描述

2.3令牌桶限流算法

令牌桶是网络流量整形(TrafficShaping)和速率限制(Rate Limiting)中最常使用的-种算法。对于每一个请求,都需要从令牌桶中获得一个令牌,如果没有获得令牌,则需要触发限流策略
如图7-5所示,系统会以一个恒定速度(r tokens/sec)往固定容量的令牌桶中放入令牌,如果此时有客户端请求过来,则需要先从令牌桶中拿到令牌以获得访问资格

在这里插入图片描述
假设令牌生成速度是每秒10个,也就等同于QPS=10,此时在请求获取令牌的时候,会存在三种情况

  • 请求速度大于令牌生成速度:那么令牌会很快被取完,后续再进来的请求会被限流。
  • 请求速度等于令牌生成速度:此时流量处于平稳状态。
  • 请求速度小于令牌生成速度:说明此时系统的并发数并不高,请求能被正常处理

由于令牌桶有固定的大小,当请求速度小于令牌生成速度时,令牌桶会被填满。所以令牌桶能够处理突发流也就是在短时间内新增的流量系统能够正常处理,这是令牌桶的特性。

2.4 漏桶限流算法

漏桶限流算法的主要作用是控制数据注入网络的速度,平滑网络上的突发流量。

漏桶限流算法的原理如图7-6所示,在漏桶算法内部同样维护一个容器,这个容器会以恒定速度出水,不管上面的水流速度多快,漏桶水滴的流出速度始终保持不变。实际上消息中间件就使用了漏桶限流的思想,不管生产者的请求量有多大,消息的处理能力取决于消费者

在这里插入图片描述

在漏桶限流算法中,存在以下几种可能的情况

  • 请求速度大于漏桶流出水滴的速度:也就是请求数超出当前服务所能处理的极限,将会触发限流策
    略。
  • 请求速度小于或者等于漏桶流出水滴的速度,也就是服务端的处理能力正好满足客户端的请求量将正常执行。

漏桶限流算法和令牌桶限流算法的实现原理相差不大,最大的区别是漏桶无法处理短时间内的突发流量
漏桶限流算法是一种恒定速度的限流算法

三、服务熔断与降级

在微服务架构中,由于服务拆分粒度较细,会出现请求链路较长的情况。如图7-7所示,用户发起一个请求操作,需要调用多个微服务才能完成;
在这里插入图片描述

在高并发场景中,这些依赖服务的稳定性对系统的影响非常大,比如某个服务因为网络延迟或者请求超时等原因不可用时,就会导致当前请求阻塞,如图7-8所示,一旦某个链路上被依赖的服务不可用,很可能出现请求堆积从而导致出现雪崩效应

在这里插入图片描述

3.1 服务熔断

所以,服务熔断就是用来解决这个问题的方案。服务熔断是指当某个服务提供者无法正常为服务调用者提供服务时,比如请求超时、服务异常等,为了防止整个系统出现雪崩效应,暂时将出现故障的接口隔离出来,断绝与外部接口的联系,当触发熔断之后,后续一段时间内该服务调用者的请求都会直接失败,直到目标服务恢复正常。

3.2服务降级需要有一个参考指标

服务降级需要有一个参考指标,一般来说有以下几种常见方案

  • 平均响应时间:比如1s内持续进入5个请求,对应时刻的平均响应时间均超过闻值,那么接下来在一个固定的时间窗口内,对这个方法的访问都会自动熔断。
  • 异常比例:当某个方法每秒调用所获得的异常总数的比例超过设定的闻值时,该资源会自动进入降级状态,也就是在接下来的一个固定时间窗口中,对这个方法的调用都会自动返回
  • 异常数量:和异常比例类似,当某个方法在指定时间窗口内获得的异常数量超过闯值时会触发熔断。

Sentinel也提供了熔断功能,在后续的章节中我们会演示如何通过Sentinel实现服务熔断

四 分布式限流架Sentinel

Sentinel是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、服务降级、系统负载保护等多个维度来帮助我们保障微服务的稳定性。
在阿里巴巴内部有一句口号:“稳定压倒一切”,稳定性是系统的基础能力,稳定性差的系统会出现服务超时或服务不可用,给用户带来不好的体验,从而对业务造成恶劣影响。所以系统稳定性是一条“红线”,任何业务需求或技术架构升级都不应该越过它。
目前,Sentinel在阿里内部被广泛使用,为多年双11、双12、年货节618等大促活动保驾护航,并Sentinel开源以后也被很多互联网企业采用。

4.1 Sentinel的特性

如图7-9所示,Sentinel的特性非常多

  • 丰富的应用场景:几乎涵盖所有的应用场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制等。
  • 实时监控:Sentinel提供了实时监控功能。开发者可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群汇总运行情况。
  • 开源生态支持:Sentinel提供开箱即用的与其他开源框架/库的整合,例如与Spring CloudDubbogRPC的整合。开发者只需要引入相应的依赖并进行简单的配置即可快速接入Sentinel。
  • SPI扩展点支持:Sentine提供了SPI扩展点支持,开发者可以通过扩展点来定制化限流规则,动态数据源适配等需求

在这里插入图片描述

4.2 Sentinel的组成

Sentinel分为两个部分:

  • 核心库(Java客户端):不依赖任何框架/库,能够运行于所有Jva运行时环境,同时对Dubbo、SpringCloud等框架也有较好的支持。
  • 控制台(Dashboard):基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

4.3 SentinelDashboard的部署

Sentinel提供一个轻量级的开源控制台,它支持机器发现,以及健康情况管理、监控(单机和集群)、规则管理和推送的功能。
SentinelDashboard的安装步骤如下

  • 在GitHub中Sentinel的源码仓库中:
  1. 直接下载源码通过mvnclean package自己构建
  2. 直接在Release页面下载已经构建好的Jar
  • 通过以下命令启动控制台:
java-Dserver.port=7777 -Dcsp,sentinel.dashboard.server=localhost;7777 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

其中,启动参数的含义如下。
-Dserver.port:指定Sentinel控制台的访问端口,默认是8080
-Dcsp.sentineldashboard.server:指定Sentinel Dashboard控制台的IP地址和端口,这里进行设置的目的是把自己的限流数据暴露到监控平台。
-Dprojectname:设置项目名称

在这里插入图片描述

4.4Sentinel的基本应用

使用Sentinel的核心库来实现限流,主要分以下几个步骤。

  • 定义资源
  • 定义限流规则。
  • 检验规则是否生效

所谓的资源,就是需要通过限流保护的最基本元素,比如一个方法。有了需要保护的资源之后,就可以针对该资源设置流量控制规则了。
下面先通过一个简单的案例来演示一下Sentinel的基本使用方法,让读者对Sentinel有一个基本的认识。

4.4.1Sentinel实现限流首先,引入Sentinel的核心库:

<dependency><groupId>com.alibaba,csp</groupId><artifactId>sentinel-core</artifactId><version>1.7.1</version>
</dependency>

然后,定义一个普通的业务方法

在这里插入图片描述

在doSomething方法中,通过使用Sentinel中的SphU.entry(“doSomething”)定义一个资源来实现流控的逻辑,它表示当请求进入doSomething方法时,需要进行限流判断。如果抛出BlockException异常,则表示触发了限流。接着,针对该保护的资源定义限流规则:

在这里插入图片描述
针对资源doSomething,通过initFlowRules设置限流规则,其中参数的含义如下

  • Grade:限流闻值类型,QPS模式(1)或并发线程数模式(0)。
  • count:限流闻值
  • resource:设置需要保护的资源。这个资源的名称必须和SphU.entry中使用的名称保持一致上述代码的意思是,针对doSomething方法,每秒最多允许通过20个请求,也就是QPS为20最后,通过main方法进行测试

在这里插入图片描述

Sentinel 限流日志查看

在这里插入图片描述
从日志中可以看出,这个程序每秒稳定输出(doSomething)20次,和规则中预先设定的闻值是一样的,而被拒绝的请求每秒最高达50多万次。

4.4.2 资源的定义

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

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

相关文章

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…

【机器学习】多模态机器学习

多模态机器学习是指利用多种不同的数据类型&#xff08;如图像、文本、音频等&#xff09;来训练和优化机器学习模型。相比于单一模态的机器学习&#xff0c;多模态机器学习可以更好地模拟现实世界中的复杂信息交互&#xff0c;从而提高模型的性能和泛化能力&#xff0c;同时也…

大数据机器学习与深度学习—— 生成对抗网络(GAN)

GAN概述 在讲GAN之前&#xff0c;先讲一个小趣事&#xff0c;你知道GAN是怎么被发明的吗&#xff1f;据Ian Goodfellow自己说&#xff1a; 之前他一直在研究生成模型&#xff0c;可能是一时兴起&#xff0c;有一天他在酒吧喝酒时&#xff0c;在酒吧里跟朋友讨论起生成模型。然…

Linux—深入理解进程的概念,PCB,父子进程及查看进程信息的两种方法

进程的概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等。 内核观点&#xff1a;担当分配系统资源&#xff08;CPU&#xff0c;内存&#xff09;的实体。 1.描述进程-PCB 我们知道程序是代码编译好后形成的可执行文件&#xff0c;存放在磁盘上。而我…

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…

Prompt提示优化工具

在大模型使用过程中,Prompt尤为重要。一个好的Prompt可以解决很多的问题。那么如何撰写一个完美的Prompt? 下面汇总了一些Prompt工具,可以辅助日常Prompt的编写。 欢迎关注公众号 1. prompt perfect 可以自动优化已有的提示,比较多个模型的输出,运行智能体等。 https:…

带大家做一个,易上手的家常土豆炒瘦肉(糖醋水果版)

先那一块瘦肉 用水化冰 拿一颗土豆 去皮切成小块 瘦肉洗干净 然后切成小块 与土豆混在一起 打一个鸡蛋 将 鸡蛋液 一小勺淀粉 小半勺生抽 一小勺料酒 用手抓均匀 起锅烧油 倒入瘦肉土豆 翻炒 看肉变色了 加入 一包番茄酱(可以多放一点 味道足一点) 小半勺老抽调色 小半…

文献速递:PET-影像组学专题--影像组学和肺癌免疫治疗反应:文献系统综述

文献速递&#xff1a;PET-影像组学专题–影像组学和肺癌免疫治疗反应&#xff1a;文献系统综述 01 文献速递介绍 肺癌&#xff08;LC&#xff09;是全球癌症相关死亡的主要原因&#xff0c;尽管在诊断和治疗方面取得了进展[2,3]&#xff0c;但它仍然对公共健康构成严重威胁[…

Android : Room 数据库的基本用法 —简单应用_一_入门

1.Room介绍&#xff1a; Android Room 是 Android 官方提供的一个持久性库&#xff0c;用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层&#xff0c;使得使用 SQLite 数据库变得更加容易和方便。 以下是 Android Room 的主要特点&#xff1a; 对象关系映射…

无代码,零基础!手把手教你掌握Stable Diffusion,创作出惊艳AI插画!

【前言】 Stable Diffusion是一款开源、免费的应用程序&#xff0c;因为其生态开放且发展迅速&#xff0c;所以不同时期的安装、配置方式可能都会有所变化。如果遇到什么安装上的问题可以评论提出&#xff0c;帮你解答。 关于Stable Diffusion Stable Diffusion&#xff08;简…

IDEA中工具条中的debug按钮不能用了显示灰色

IDEA中工具条中的debug按钮不能用了显示灰色 1. 问题描述 IDEA上的DEBUG按钮突然变成了灰色&#xff1a; 2. 解决办法 一通搜索&#xff0c;终于找到解决办法 点击 File -> Project Structure如下图操作 3. 重启&#xff0c;解决 4. 参考 https://www.cnblogs.com…

自学编程推荐一个容易学的中文编程工具,构件箱之单选框组简介

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础轻…

C语言之基本数据类型和数

目录 算数类型和基本数据类型 基数 基数转换 由八进制数、十六进制数、二进制数向十进制数转换 由十进制数向八进制数、十六进制数、二进制数转换 二进制和十六进制的基数转换 在学习基本数据类型之前我们先来学习数。 算数类型和基本数据类型 在前面的学习中我们可以使用…

Docker 设置国内镜像源

Docker 设置国内镜像源 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 具体配置如下&#xff1a; {"registry-mirrors" : ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirro…

Flutter Dart FFI Pointer<Uint8>类型如何转成数组或String

前言 继上一次发布的 Flutter 直接调用so动态库&#xff0c;或调用C/C源文件内函数 内容&#xff0c;最终我选择了第二种方式&#xff0c;直接把整个 Native C 的项目源代码放进了 Flutter 工程里编译&#xff08;放在iOS的目录是因为它不支持自定义源码路径&#xff0c;Andro…

阶段十-java新特性

JDK9新特性 1.模块化系统 jar包结构的变化 jar -》model -》package -》class 通过不同的模块进行开发 每个模块都有自己的模块配置文件module-info.java 2.JShell JDK9自带的命令行开发&#xff0c;在进行简单的代码调试时可以直接编译使用 可以定义变量&#xff0c;方法&…

大数据与人工智能——神经网络是如何工作的?

大数据与人工智能——神经网络是如何工作的&#xff1f; 我们习惯于去了解所使用工具、中间件的底层原理&#xff0c;本文则旨在帮助大家了解AI模型的底层机制&#xff0c;让大家在学习或应用各种大模型时更加得心应手&#xff0c;更加适合没有AI基础的小伙伴们。 一、GPT与神…

Java实现机考程序界面

机考界面如下&#xff08;单选题&#xff09;&#xff0c;上方是题目状态&#xff0c;下方是题目&#xff0c;1/5/1是已做题目数量、总共题目数量和答对题目数量。 再看一下多选题的界面。 判断题的界面。 回答正确时的反馈&#xff0c;会给出用时。 回答错误时的反馈&#xff…

社会不教,精英不讲,坎儿还得自己过(揭秘人才成长规律)

推荐大家去看看天涯社区的精华帖子&#xff1a;《社会不教&#xff0c;精英不讲&#xff0c;坎儿还得自己过&#xff08;揭秘人才成长规律&#xff09;》 原出处天涯精华帖&#xff1a;《社会不教&#xff0c;精英不讲&#xff0c;坎儿还得自己过&#xff08;揭秘人才成长规律&…

【教3妹学编程-算法题】消除相邻近似相等字符

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2…