前言

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使用令牌桶实现预热【原理源码】相关推荐

  1. sentinel 时间窗口_Sentinel潜龙勿用篇

    前言 我为什么写这篇文章,是因为Sentinel实在是太强大太好用了,再加上阿里开源,Sentinel的发展迅猛.已有多家公司生产使用,但但凡神功,一个不慎,就有可能走火入魔,轻则离职走人,重则走火入 ...

  2. sentinel 时间窗口_Sentinel滑动窗口算法

    在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...

  3. sentinel 时间窗口_Sentinel 实战-规则持久化

    规则持久化的5种方式 规则丢失 无论是通过硬编码的方式来更新规则,还是通过接入 Sentinel Dashboard 后,在页面上操作来更新规则,都无法避免一个问题,那就是服务重新后,规则就丢失了,因 ...

  4. 单个接口添加超时时间_SpringBoot使用Guava令牌桶对接口限流

    pom.xml引入jar包 com.google.guava guava 29.0-jre 代码 @RestControllerpublic class HelloController { //创建令 ...

  5. 【面试大全-高并发】-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景

    参考思路:限流算法常用的几种实现方式有如下四种:计数器.滑动窗口.漏桶和令牌桶: ● 计数器: ○ 思想:在固定时间窗口内对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清 ...

  6. sentinel 时间窗口的实现

    本文的github地址点击这里 获取时间窗口的主要流程 在 Sentinel 中,主要是通过 LeapArray 类来实现滑动时间窗口的实现和选择.在 sentinel 的这个获取时间窗口并为时间窗口 ...

  7. 信号量与令牌桶_限流的4种方式令牌桶实战

    限流的4种方式 正文 限流 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机.常用的限流算法有令牌桶和和漏桶,而Google开源项目Guava ...

  8. 限流算法-固定时间窗口

    本文介绍了固定时间窗口限流算法. 前言 首先限流的算法有很多种,比如固定时间窗口限流算法.滑动时间窗口算法.漏桶算法.令牌桶算法,其余的算法后续我们会一一介绍. 一.限流场景 站在服务调用方的角度来说 ...

  9. 基于Redis和 Lua 实现分布式令牌桶限流

    rpc-tech-stack 系列的实践文章 ~ 本文属于限流话题. 限流是一个很大的话题,准备把其中的所有限流器都实现一遍,以此也算全都写过了,到时候再用也不至于会心虚,毕竟真实写完成过.本文主要讲 ...

最新文章

  1. 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
  2. Boost:mighty bimap强大的双图的测试程序
  3. Java黑皮书课后题第3章:**3.21(科学:某天是星期几)泽勒一致性...编写程序,提示用户输入年、月、该月的哪一天,显示它是一周中的星期几
  4. Modelsim command line 传参数到 .do 文件
  5. 深度学习之对象检测_深度学习时代您应该阅读的12篇文章,以了解对象检测
  6. HTML/CSS基础知识总结
  7. layui admin 当前子页面 刷新 其他页面 layui 关闭 子弹窗
  8. fiddler4+雷电模拟器4.0.82抓包设置
  9. Altium Designer 17安装教程
  10. 【FPGA教程案例31】通信案例1——基于FPGA的ASK调制信号产生
  11. 用正则表达式清除各类符号
  12. 计算机io设备是cpu控制的吗,I/O控制器及控制方式,了解一下
  13. 出现问题请与你的系统管理员联系 照片出现问题请与你的系统管理员 照片出现问题请与系统管理员联系 无法打开应用请与管理员联系
  14. JAVA java学习(46)——————如何将Eclipse设置为中文版
  15. camtasia 2022标准版录制电脑屏幕视频教程
  16. html实现雪花飘落
  17. Vue:运行项目时报错:Module not found: Error: Can't resolve 'sass-loader' in
  18. Tensorflow图像处理相关操作
  19. Python.exe - 无法找到入口/无法定位程序输入点...于动态链接库
  20. FLD5302和FLD5303升压充电芯片

热门文章

  1. commit your changes or stash them before you can merge
  2. [转] 大规模服务设计部署经验谈
  3. 【ApsaraSRE专题推荐--1期】Sedawk笔记系列
  4. 【51CTO学院三周年】51cto学院的大数据培训之心路历程
  5. atitit..主流 浏览器 js 发动机 内核 市场份额 attialx总结vOa9
  6. 一个交换程序的通用版本
  7. Kubernetes 日志收集的原理,看这一篇就够了
  8. 某外包程序员炫耀:不用管绩效和代码质量,工作摸鱼,从不加班,没有pua,外包是真的舒服!...
  9. 滴滴CTO张博:我人生重要的四次选择
  10. Ipad写代码真香,包邮送一个!