深入解析分布式限流

一、概述

1.1 主要解决的问题

  1. 访问请求流量远远大于服务器的负载,致使服务器宕机,导致整个服务的不可用;- 限流
  2. 当前服务调用其他服务,其他服务不可用,导致当前服务的调用一直超时,进而当前服务的线程资源耗尽,进而服务宕机,产生服务雪崩。- 服务熔断【或降级】

1.2 限流定义

通过限制并发数或一段时间窗口允许处理的最大连接数来保护系统,一旦超过设定阈值,对当前请求进行处理。主要的处理方式有:跳转到错误页面、进入排队系统或降级等。本质上,就是损失一部分用户的可用性,来保证整体的可用性

1.3 常见限流规则

1. QPS或连接数控制;例如对单个IP的限制、单台机器的限制、单个服务组的限制或整个机房的限制
2. 传输速率:例如资源的下载速度
3. 黑白名单。

1.4 分布式限流

把整个分布式环境中所有服务器当做一个整体来考量。比如说针对IP的限流,我们限制了1个IP每秒最多10个访问,不管来自这个IP的请求落在了哪台机器上,只要是访问了集群中的服务节点,那么都会受到限流规则的制约。必须将限流信息保存在一个中心化的组件上,这样它就可以获取到集群中所有机器的访问状态,目前有两个比较主流的限流方案:

  1. 网关层限流:应用在流量入口处;
  2. 中间件限流:将限流信息存储在分布式环境中某个中间件里(比如Redis缓存),每个组件都可以从这里获取到当前时刻的流量统计,从而决定是拒绝服务还是放行流量。

二、常用的限流方案

在这里插入图片描述

2.1 Guava限流

一种Google研发的客户端限流组件,非常轻量级。但仅支持单机限流。底层是令牌桶限流算法

2.2 网关层限流

将系统流量的分布层次抽象成一个简单的漏斗模型来看。
在这里插入图片描述
上面是一个最普通的流量模型,从上到下的路径依次是:

  1. 用户流量从网关层转发到后台服务
  2. 后台服务承接流量,调用缓存获取数据
  3. 缓存中无数据,则访问数据库

Nginx限流

  1. 基于IP地址和基于服务器的访问请求限流
  2. 并发量(连接数)限流
  3. 下行带宽速率限制

SpringCloud 的GateWay组件限流。

2.3 中间件限流

方案1: Redis+LUA脚本实现限流:
方案2: Sentinal限流:底层使用滑动窗口算法来限流。

三、常用限流算法

3.1 计数器限流

概述:在一定周期内累加访问次数,当访问次数达到阈值时,触发限流策略,当进入下一个时间周期时,计算器会清零,重新计数。
适用场景:短信发送次数限制
存在问题:临界问题,会造成系统的抖动。假设时间周期为1s,阈值为50。开始时间是32s, 32.0-32.8s请求次数为10,32.8-33s请求次数为30,33.0-33.2请求次数为30,33.3-34s请求次数为30,可以看出在32s和33s时间窗口内都没有触发限流阈值,但在32.8-33.2区间内超过限流阈值,造成系统的不稳定。

3.2 滑动窗口限流

概述:解决了计数器限流算法的临界问题。将固定周期划分为n个小的时间段,分别在每个时间段内统计请求访问次数,然后根据时间将窗口向前滑动并删除过期的时间段,时间段越短统计的越准,很好的解决了临界问题
适用场景:sentinel底层采用该算法
存在问题:窗口大小选择以及n大小的选择。

3.3 令牌桶限流

概述:对于每一个请求,都需要先从令牌桶中获取令牌。若获取不到令牌,触发限流策略。系统会以一个恒定速率向令牌童中放入令牌,令牌中满了后直接丢弃令牌
适用场景:网络流量整形和速率限制,适合处理突发流量。当突发流量来的时候,可以直接获取令牌中所有的令牌进行快速处理。Guava底层就采用该算法
存在问题:虽然可以处理突发流量,但后台系统的压力也会瞬间增大,要合理设置令牌数量。

3.4 漏桶限流算法

概述控制数据注入网络的速度。在漏桶内部维护一个容器,这个容器会以恒定速率出水,不论漏桶的流入速度多快,出水的速度是固定的,消息中间件就利用了该思想。
适用场景:流量平滑
存在的问题:无法处理突发流量。漏桶的天然特性决定了它不会发生突发流量,就算每秒1000个请求到来,那么它对后台服务输出的访问速率永远恒定。而令牌桶则不同,其特性可以预存一定量的令牌,因此在应对突发流量的时候可以在短时间消耗所有令牌,其突发流量处理效率会比漏桶高,但是导向后台系统的压力也会相应增多。

四、Guava流量预热

4.1 概述

核心思想:动态的调整令牌的发放速度,让流量变化更加平滑。例如:某个接口设定了100个Request每秒的限流标准,同时使用令牌桶算法做限流。假如当前时间窗口内都没有Request过来,那么令牌桶中会装满100个令牌。如果在下一秒突然涌入100个请求,这些请求会迅速消耗令牌,对服务的瞬时冲击会比较大。

4.2 预热模型

在这里插入图片描述

其中横坐标是令牌桶的当前容量,纵坐标是令牌发放速率。

闲时到忙时的流量转变:假定当前我们处于闲时流量阶段,没几个访问请求,这时令牌桶是满的。接着在下一秒突然涌入了10个请求,这些请求开始消耗令牌桶中的令牌。在初始阶段,令牌的放行速度比较慢,在第一个令牌被消耗以后,后面的请求要经过3x时间间隔也就是0.3s才会获取第二块令牌。随着令牌桶中令牌数量被逐渐消耗,当令牌存量下降到最大容量一半的时候(Half位置),令牌放行的速率也会提升,以稳定间隔0.1s发放令牌。
流量从忙时转变为闲时:令牌发放速率是由快到慢逐渐变化。起始阶段的令牌放行间隔是0.1s,随着令牌桶内令牌逐渐增多,当令牌的存量积累到最大容量的一半后,放行令牌的时间间隔进一步增大为0.3s。

RateLimiter正是通过这种方式来控制令牌发放的时间间隔,从而使流量的变化更加平滑。

五、Sentinel工作原理

概述:一款高性能的分布式限流组件,能够保护微服务架构下的应用程序,实现服务限流和服务降级熔断等。
主要原理:利用AOP切面来拦截所有的请求,对请求进行实时计数、实时统计等,并根据设定的阈值来决定是否放行该请求。
主要流程为:

1. 规则配置。利用sentinel提供的功能来配置限流规则,即每分钟请求的次数。限流规则会被加载到内存中,sentinel会利用这些限流规则进行限流
2. 请求拦截。在程序处理处理之前,sentinel利用AOP切面拦截所有的请求;
3. 统计请求。拦截后,sentinel会对请求进行实时统计,在内存中维护的时间窗口内统计请求qps,响应时间以及异常次数等;
4. 判断流量。如果qps超过设定的阈值,则进行限流处理,包括降级等;若调用其他服务的响应时间或异常次数超过阈值,则直接熔断服务,不再调用其他服务,返回一个默认的降级值
5. 动态调整限流。可以在运行期间,sentinel可以修改阈值,删除规则等

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

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

相关文章

3D产品配置器有哪些实际的商业应用场景?

3D产品配置器在商业领域有着广泛的应用场景,它们不仅能够提升客户体验,还能帮助企业优化内部流程和加速产品开发。以下是一些具体的商业应用实例: 1、在线定制和销售:3D产品配置器允许客户在购买前根据自己的喜好定制产品&#x…

Vue.js+SpringBoot开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

你知道数据库有哪些约束吗?

目录 1. NULL约束 2. 唯一(UNIQUE)约束 3. 默认值(DEFAULT)约束 4. 主键约束 5. 外键约束 6. CHECK约束 数据库约束是一种用于确保数据库中数据完整性和一致性的规则或条件。这些约束可以应用于表、列或整个数据库&#xff0…

【JAVA快速编写UI】 Java 编写一个编码转换和加解密工具,可以创建一个简单的 GUI 应用程序(例子)

EncodingDecodingTool/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── rockmelodies/ │ │ │ └── encodingdecodingtool/ │ │ │ ├── MainApp.java │ │ │ …

Linux安装Mysql5.7数据库

一、前置条件 系统版本:Linux CentOS 7.5 MySQL版本:mysql5.7.31 二、操作步骤 2.1、关闭mysql服务 service mysqld stop 提示使用命令:systemctl stop mysqld.service 2.2、grep查找已安装的mysql服务 rpm -qa | grep -i mysql 2.3、卸载…

51单片机LED8*8点阵显示坤坤跳舞打篮球画面

我们作为一名合格的 ikun,专业的小黑子,这个重要的知识必须学会。 先看效果: 51LED点阵_鸡你太美 这里我们首先要用到延时函数Delay: void Delay(unsigned int xms) {unsigned char i, j;while(xms--){ i 2;j 239;do{while (-…

国内用户如何注册WhatsApp商业账号?

国内用户如何注册WhatsApp商业账号? 国内的用户,如果想注册WhatsApp商业账号,一种是直接通过Meta官方进行申请注册,然后进行企业认证。另外一种是通过 WhatsApp 官方授权的商业解决方案提供商来申请、注册账号,比如牛…

如何入职车载测试

以下课件都可以学习,一对一教你如何入职车载 可以学习的内容如下:第一:仪表项目、导航项目、车控项目、OTA升级项目、UDS诊断项目。第二:DBC数据库制作、CDD数据库制作。第三:项目规范文档阅读、调查表理解。第四&…

Android版本特性

一、Android L 后 ART替换dalvik Dalvik是Google公司自己设计用于Android平台的虚拟机。 Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。 它可以支持已转换为** .dex格式**的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩…

Java数组的概念及使用

在讲数组之前,先看一个案例。假设下图为学生考试成绩图,如果想要存储该学生的考试成绩,是不是可以定义一个变量进行存储?变量的定义及使用的,可参考链接进行学习。java变量是什么?怎么定义的?有…

MateBook 14s 2023款 集显 触屏(HKFG-16)原厂Win11系统

HUAWEI华为MateBook14s笔记本电脑2023款原装Windows11,恢复出厂开箱状态系统下载 适用型号:HKFG-XX、HKFG-16、HKFG-32 链接:https://pan.baidu.com/s/1GBPLwucRiIup539Ms2ue0w?pwdfm41 提取码:fm41 原厂系统自带所有驱动、…

Nodejs 第五十八章(大文件上传)

在现代网站中,越来越多的个性化图片,视频,去展示,因此我们的网站一般都会支持文件上传。 文件上传的方案 大文件上传:将大文件切分成较小的片段(通常称为分片或块),然后逐个上传这…

C语言技能数(知识点汇总)

C语言技能数(知识点汇总) C 语言概述特点不足之处 标准编程机制 数据类型变量数据类型字符类型整数类型符号位二进制的原码、反码和补码 浮点类型布尔类型 常量字面常量const 修饰的常变量#define定义的标识符常量枚举常量 sizeofsizeof(结构体)不要对 v…

代码随想录算法训练营第28天|93.复原IP地址 |78.子集 |90.子集II

代码随想录算法训练营第28天|93.复原IP地址 |78.子集 |90.子集II 93.复原IP地址 本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了 题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B…

React——开发者工具

浏览器插件:谷歌浏览器插件react-devtools 方式1:chrome应用商店添加 方式2:下载安装包放在浏览器上

打靶记录(个人学习笔记)

一、信息收集 1、主机发现 通过nmap对此网段进行扫描,可以确定靶机ip为192.168.189.144 2、端口扫描 确定了靶机ip之后,我们来扫描端口 发现80端口开放,先访问80端口 用插件识别出一些信息 Wappalyzer插件获得信息:Web服务&am…

ThingsBoard Edge 设备控制

文章目录 一、RPC 功能1.服务端 RPC2.客户端 RPC3.MQTT RPC API3.1.服务端RPC3.2.客户端RPC 二、设备控制1.环境准备2.创建设备3.服务端PRC3.1.RPC消息主题3.2.程序源码3.3.创建仪表板3.4.边缘分配仪表板3.5.测试 4.客户端RPC4.1.RPC消息主题4.2.程序源码4.3.规则链4.4.测试 Th…

【Git】error: bad signature 0xb86f1e1 和 bfatal: index file corrupt

一、问题 之前都好好的,今天执行 git add .的时候突然报错 报错原因翻译成中文:索引文件损坏 二、解决方法 方法1: 删除.git隐藏文件夹中的index文件 然后执行 git reset 重新生成index文件 git reset 方法2: 重新从远程克隆…

xinference - 大模型分布式推理框架

文章目录 关于 xinference使用1、启动 xinference设置其他参数 2、加载模型3、模型交互 其它报错处理 - transformer.wte.weight 关于 xinference Xorbits Inference(Xinference)是一个性能强大且功能全面的分布式推理框架。 可用于大语言模型&#xff…

TIMESNET: TEMPORAL 2D-VARIATION MODELINGFOR GENERAL TIME SERIES ANALYSIS

本文整理至https://zhuanlan.zhihu.com/p/606575441这里是清华大学软件学院机器学习组官方公众号(THUML-LAB),欢迎关注我们,获取最新资讯! 本文介绍本组ICLR2023时间序列分析方向的最新工作:TimesNet: Temporal 2D-Variation Mode…