sentinel 时间窗口_Sentinel使用令牌桶实现预热【原理源码】
前言
Sentinel的QPS流控效果有快速失败、预热模式、排队等待、预热+排队等待模式,本文主要分析预热模式中是如何使用令牌桶算法限流的。
一、流控效果源码结构
在FlowRule更新缓存时,根据配置的不同类型初始化不同的流控效果处理类。
1.流控效果封装入口
2.分发不同的控制类
3.流控控制类图
二、快速失败
快速失败即发送流控时抛出FlowException。
1.快速失败流程
备注@1 获取当前已经使用的线程数或者QPS@2 与阈值进行判断,是否允许本次通行@3 QPS流控并且prioritized设置为true表示预占用令牌@4 大于阈值触发流控@5 小于阈值允许通行
2.预占用令牌
预占用令牌:当基于QPS流控时并且prioritized设置为true,表示当前时间窗口令牌不够时,预占用下个时间窗口的令牌并返回需要等待的时间。
备注:在不考虑优先级(预占用)令牌的情况,快速失败比较简单。
三、令牌桶原理
预热模式缓慢增加流量的一种方式,避免瞬间流量将系统压垮。1.令牌桶图示
工作过程
请求流量从令牌桶中获取令牌,持有令牌放行,否则被拒
假如设置阈值每秒允许100个请求通过,则请求发送速率r=100/s
需要令牌生产速率为1/r,即1/100每10毫秒产生一个令牌
令牌桶容量为b已满多余的令牌将被丢弃
令牌桶为空请求被拒
允许突发流量最大突发流量为令牌桶容量b
请求通过相应的令牌从令牌桶中移除
2.令牌桶限流原理
假如系统平时流量很低,突然陡增的流量需要缓慢增加。具体到令牌桶,可以通过控制令牌的生产速率来对流量进行控制。令牌生产速率如何控制?
我们在使用sentinel设置QPS的预热流控时,需要设置阈值count和预热时长warmUpPeriodInSec,下面梳理下与下图坐标图的关系。
坐标图说明
参数 | 说明 |
x轴 | 表示令牌桶中的令牌数量 |
y轴 | 生产一个令牌需要的时间(秒) |
stableInterval | 稳定生产一个令牌需要的时间 |
coldInterval | 生产一个令牌需要的最大时长,与冷启动因子coldFactor有关,可以通过-Dcsp.sentinel.flow.cold.factor设置,默认为3。 |
warmUpPeriodInSec | 预热时长,默认为10秒。对应到坐标图中为(2)梯形面积 |
thresholdPermits(warningToken) | 令牌桶中的一个阈值,超过该值时开启预热 |
maxPermits(maxToken) | 令牌桶中最大令牌数 |
换算关系
count,已知由用户设置,例如每秒允许通过100个请求
warmUpPeriodInSec,已知由用户设置,默认为10秒,时间区域上红色(2)梯形区域
coldFactor,已知默认为3
公式一:stableInterval = 1/count公式二:coldInterval = stableInterval * coldFactor
备注:由于coldFactor默认为3,y轴stableInterval~coldInterval的距离是0~stableInterval的距离两倍,时间区域上红色(2)梯形区域是红色1的长方形区域的两倍。
公式三:坐标时间(1)长方形区域面积 = 长(thresholdPermits(warningToken)) * 宽(stableInterval)公式四:坐标时间(1)长方形区域面积 = 0.5 * warmUpPeriodInSec公式五:thresholdPermits(warningToken)=0.5 * warmUpPeriodInSec/stableInterval
备注:梯形的面积 = (上低+下低)* 高 ➗ 2 推导出maxPermits(maxToken)的值。
公式六:maxPermits(maxToken) = thresholdPermits(warningToken) + 2 * warmUpPeriodInSec ➗ (stableInterval + coldInterval)
备注:由斜率公式k=(y1-y2)➗(x1-x2),得出斜率如下。
slope = (coldInterval-stableInterval)➗(maxPermits(maxToken)-thresholdPermits(warningToken))
原理概述
当令牌桶中的令牌数小于thresholdPermits(warningToken)时,令牌按照固定速率生产,请求流量稳定。当令牌数大于thresholdPermits(warningToken)时,开启预热。此段时期,生产的令牌的速率小于令牌滑落的速度,一段时间后,令牌小于等于thresholdPermits(warningToken),请求回归到稳定状态,预热结束。
四、预热源码分析
1.WarmUpController构造函数
备注:此部分主要计算了warningToken阈值、最大令牌数maxToken、斜率slope,详细推导过程见原理部分。
2.请求判断逻辑
3.令牌的生产和滑落
备注:从代码可以看出sentinel中桶中的令牌生产和移除是在下次请求到来时一起处理的,另外Sentinel提供的令牌生产公式与当前时间currentTime有关系,如果一个冷系统好久没有流量,瞬间来了很大流量,此时的桶中令牌数会直接到达最大值maxToken,这也是官方提供的曲线图中开始流量比较陡的原因。
作者丨梁勇来源丨瓜农老梁欢迎关注公众号「瓜农老梁」
「瓜农老梁 学习同行」
sentinel 时间窗口_Sentinel使用令牌桶实现预热【原理源码】相关推荐
- sentinel 时间窗口_Sentinel潜龙勿用篇
前言 我为什么写这篇文章,是因为Sentinel实在是太强大太好用了,再加上阿里开源,Sentinel的发展迅猛.已有多家公司生产使用,但但凡神功,一个不慎,就有可能走火入魔,轻则离职走人,重则走火入 ...
- sentinel 时间窗口_Sentinel滑动窗口算法
在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...
- sentinel 时间窗口_Sentinel 实战-规则持久化
规则持久化的5种方式 规则丢失 无论是通过硬编码的方式来更新规则,还是通过接入 Sentinel Dashboard 后,在页面上操作来更新规则,都无法避免一个问题,那就是服务重新后,规则就丢失了,因 ...
- 单个接口添加超时时间_SpringBoot使用Guava令牌桶对接口限流
pom.xml引入jar包 com.google.guava guava 29.0-jre 代码 @RestControllerpublic class HelloController { //创建令 ...
- 【面试大全-高并发】-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景
参考思路:限流算法常用的几种实现方式有如下四种:计数器.滑动窗口.漏桶和令牌桶: ● 计数器: ○ 思想:在固定时间窗口内对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清 ...
- sentinel 时间窗口的实现
本文的github地址点击这里 获取时间窗口的主要流程 在 Sentinel 中,主要是通过 LeapArray 类来实现滑动时间窗口的实现和选择.在 sentinel 的这个获取时间窗口并为时间窗口 ...
- 信号量与令牌桶_限流的4种方式令牌桶实战
限流的4种方式 正文 限流 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机.常用的限流算法有令牌桶和和漏桶,而Google开源项目Guava ...
- 限流算法-固定时间窗口
本文介绍了固定时间窗口限流算法. 前言 首先限流的算法有很多种,比如固定时间窗口限流算法.滑动时间窗口算法.漏桶算法.令牌桶算法,其余的算法后续我们会一一介绍. 一.限流场景 站在服务调用方的角度来说 ...
- 基于Redis和 Lua 实现分布式令牌桶限流
rpc-tech-stack 系列的实践文章 ~ 本文属于限流话题. 限流是一个很大的话题,准备把其中的所有限流器都实现一遍,以此也算全都写过了,到时候再用也不至于会心虚,毕竟真实写完成过.本文主要讲 ...
最新文章
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
- Boost:mighty bimap强大的双图的测试程序
- Java黑皮书课后题第3章:**3.21(科学:某天是星期几)泽勒一致性...编写程序,提示用户输入年、月、该月的哪一天,显示它是一周中的星期几
- Modelsim command line 传参数到 .do 文件
- 深度学习之对象检测_深度学习时代您应该阅读的12篇文章,以了解对象检测
- HTML/CSS基础知识总结
- layui admin 当前子页面 刷新 其他页面 layui 关闭 子弹窗
- fiddler4+雷电模拟器4.0.82抓包设置
- Altium Designer 17安装教程
- 【FPGA教程案例31】通信案例1——基于FPGA的ASK调制信号产生
- 用正则表达式清除各类符号
- 计算机io设备是cpu控制的吗,I/O控制器及控制方式,了解一下
- 出现问题请与你的系统管理员联系		照片出现问题请与你的系统管理员		照片出现问题请与系统管理员联系 无法打开应用请与管理员联系
- JAVA java学习(46)——————如何将Eclipse设置为中文版
- camtasia 2022标准版录制电脑屏幕视频教程
- html实现雪花飘落
- Vue:运行项目时报错:Module not found: Error: Can't resolve 'sass-loader' in
- Tensorflow图像处理相关操作
- Python.exe - 无法找到入口/无法定位程序输入点...于动态链接库
- FLD5302和FLD5303升压充电芯片
热门文章
- commit your changes or stash them before you can merge
- [转] 大规模服务设计部署经验谈
- 【ApsaraSRE专题推荐--1期】Sedawk笔记系列
- 【51CTO学院三周年】51cto学院的大数据培训之心路历程
- atitit..主流 浏览器 js 发动机 内核 市场份额 attialx总结vOa9
- 一个交换程序的通用版本
- Kubernetes 日志收集的原理,看这一篇就够了
- 某外包程序员炫耀:不用管绩效和代码质量,工作摸鱼,从不加班,没有pua,外包是真的舒服!...
- 滴滴CTO张博:我人生重要的四次选择
- Ipad写代码真香,包邮送一个!