SmoothBursty

主要思想

记录 1秒内的微秒数/permitsPerSencond = 时间间隔interval,每一个interval可获得一个令牌 根据允许使用多少秒内的令牌参数,计算出maxPermits setRate时初始化下次interval时间,及storedPermits

acquire时,计算当前nowMicros,如果大于下次interval时间时间,则更新storedPermits和下次interval时间,计算storedPermits能否满足此次acquire,如果能,则需要等待的时间为0,如果不能,则计算还需要多少微秒等待,并在非同步块外执行sleep操作

如果其他线程已经刷新了nextFreeTicketMicros,会如下情况acquire是无timeout的

Thread 1: acquire 11 -> storedPermits不能满足要求 -> waitTime = (acquire - stored) * stableIntervalMicros -> nextFreeTicketMicros += waitMicros -----> out lock sleep

Thread 2: acquire 2 -> nowMicros < nextFreeTicketMicros , stored = 0,被线程1消耗完了 -> freshPermits = requiredPermits - storedPermitsToSpend 即 = requiredPermits -> waitTime = freshPermits * stableIntervalMicros

-> nextFreeTicketMicros += waitTime,此时的nextFreeTicketMicros包含了Thread1需要等待的时间 -------> out lock sleep a longer time

tryAquire(num,timeout)逻辑

timeoutMicros = timeout.toMicros

lock()

nowMicros = ...

canAcquire = nextFreeTicketMicros <= nowMicros + timeoutMicros

if(!canAcquire){

return false;

}

else{

microsToWait = ...

}

unlock()

sleep(microsToWait)

return true;

#SmoothWarmingUp 主要思想和SmoothBursty相似,由于带预热过程,刚开始由于availablePermitsAboveThreshold>0.0,速率会较慢,如果持续获取令牌,则会使availablePermitsAboveThreshold=0,速率变快

从0->thresholdPermits,生成一个令牌的时间:stableIntervalMicros

从thresholdPermits-> maxPermits ,生成一个令牌的时间:stableIntervalMicros + permits * slope;

@Override final long reserveEarliestAvailable(int requiredPermits, long nowMicros) { resync(nowMicros); long returnValue = nextFreeTicketMicros; //当前需要且尽最大可能消费的 double storedPermitsToSpend = min(requiredPermits, this.storedPermits); //新鲜permits个数,这些个数是一定会产生等待的,除了0 double freshPermits = requiredPermits - storedPermitsToSpend; //计算需要wait的总时间 long waitMicros = //非busty类型的storedPermitsToWaitTime直接返回0 storedPermitsToWaitTime(this.storedPermits, storedPermitsToSpend) + (long) (freshPermits * stableIntervalMicros); //下次有票时间 this.nextFreeTicketMicros = LongMath.saturatedAdd(nextFreeTicketMicros, waitMicros); this.storedPermits -= storedPermitsToSpend; return returnValue; } //已知permitsToTake <= storedPermits

@Override

long storedPermitsToWaitTime(double storedPermits, double permitsToTake) {

//减去预热需要保留的permits,剩下的可消耗的数量

double availablePermitsAboveThreshold = storedPermits - thresholdPermits;

long micros = 0;

// measuring the integral on the right part of the function (the climbing line)

//如果有剩余可用的令牌

if (availablePermitsAboveThreshold > 0.0) {

//剩余可用的和需要获取的个数取小值

double permitsAboveThresholdToTake = min(availablePermitsAboveThreshold, permitsToTake);

// TODO(cpovirk): Figure out a good name for this variable.

//用可消耗的数量 + (可消耗的数量 - 实际消耗的数量)permitsToTime

//在预热阶段从thresholdPermits到maxPermits的耗时并非是stableIntervalMicros * n

//会耗费更多的时间,其计算规则不同,所以才需要把permitsAboveThresholdToTake从permitsToTake减去

//length 可能作为一个经验值,相当于补充permitsAboveThresholdToTake个令牌需要的平均时间值*2

//剩余可用的-实际需要且最大能消耗的令牌,得到最终剩余的令牌个数,可能是0

double length = permitsToTime(availablePermitsAboveThreshold)

+ permitsToTime(availablePermitsAboveThreshold - permitsAboveThresholdToTake);

//这里确实不好理解,从语义环境来说,它是从 thresholdPermits 到 maxPertmis 过程中

//生成 permitsAboveThresholdToTake 个令牌需要耗费的时间

//并且带coldFactor的构造函数不是public,SmoothWarmingUp也是private-package的

micros = (long) (permitsAboveThresholdToTake * length / 2.0);

//从permitsToTake中减去保留预热需留下个数后最终消耗的个数,这部分个数由于是提前存在的、富余的

//因此不需要计算到wait时间

permitsToTake -= permitsAboveThresholdToTake;

}

// measuring the integral on the left part of the function (the horizontal line)

//如果没有剩余可用令牌,走的是stableIntervalMicros * n

micros += (stableIntervalMicros * permitsToTake);

return micros;

}

length/2可以理解为下图

//permits值越小,需要的时间就越少,值越大,需要的时间就越大

private double permitsToTime(double permits) {

//double coldIntervalMicros = stableIntervalMicros * coldFactor;

// thresholdPermits = 0.5 * warmupPeriodMicros / stableIntervalMicros;

//maxPermits =

thresholdPermits + 2.0 * warmupPeriodMicros / (stableIntervalMicros + coldIntervalMicros);

//slope带比率的时间,可以理解为增长因子

//slope = (coldIntervalMicros - stableIntervalMicros) / (maxPermits - thresholdPermits)

//return表示成这样更易于理解 stableIntervalMicros + (coldIntervalMicros - stableIntervalMicros) * (permits/(maxPermits - thresholdPermits))

return stableIntervalMicros + permits * slope;

}

ratelimiter php,RateLimiter的 SmoothBursty(非warmup预热)及SmoothWarmingUp(预热,冷启动)...相关推荐

  1. 小车启动预热是原地预热,还是慢慢开动预热,哪种方式比较好?

    汽车启动后无需原地「预热」·也无需过于保守驾驶 说明: 除装备无级变速器的车辆在冬季使用时,其他车辆均无需在冷启动原地热车或低速驾驶热车. 无级变速器是最差的自动变速器,原因在于换挡结构不是常规的齿轮 ...

  2. flyme禁止系统更新_更新安卓底层还是全新手表系统?魅族Flyme再来预热中的预热...

    Flyme可以说是魅族的灵魂所在了,无论是规模还是用户数量,魅族Flyme在MIUI和EMUI面前都没有什么优势,但是凭借着其美观的UI界面,以及Aicy建议.小窗模式等独有的人性化功能,让Flyme ...

  3. RateLimiter google限流组件试析(SmoothBursty/SmoothWarmingUp)

    RateLimiter google限流组件试析(SmoothBursty/SmoothWarmingUp) RateLimiter是guava包里的限流组件,位于com.google.common. ...

  4. RateLimiter 源码分析(Guava 和 Sentinel 实现)

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 作者javadoop,资深Java工程师 原文链接https://www.javadoop.c ...

  5. 超详细的Guava RateLimiter限流原理解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 限流是保护高并发系统的三把利器之一,另外两个是缓存和降级.限流在很多场景中用来限制并发和请求量,比 ...

  6. Guava RateLimiter限流原理解析

    来源:https://zhuanlan.zhihu.com/p/60979444 限流是保护高并发系统的三把利器之一,另外两个是缓存和降级.限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,保护自 ...

  7. 【java】高并发之限流 RateLimiter使用

    1.概述 转载原文:高并发之限流 你可能知道高并发系统需要限流这个东西,但具体是限制的什么,该如何去做,还是模凌两可.我们接下来系统性的给它归个小类,希望对你有所帮助. google guava中提供 ...

  8. Guava限流器RateLimiter

    日常开发中,经常会遇到一些需要限流的场景.我们希望每一秒的请求量不要超过某一个阈值,以防止过多的请求对服务造成过大的压力.常见的限流算法有计数器法.漏桶算法和令牌桶算法,下面我们简单的了解一下这几个算 ...

  9. 逐行拆解Guava限流器RateLimiter

    日常开发中,经常会遇到一些需要限流的场景.我们希望每一秒的请求量不要超过某一个阈值,以防止过多的请求对服务造成过大的压力.常见的限流算法有计数器法.漏桶算法和令牌桶算法,下面我们简单的了解一下这几个算 ...

最新文章

  1. 明文存密码成惯例?Facebook 6 亿用户密码可被 2 万员工直接看
  2. python中outside loop_Python: 'break' outside loop
  3. python中删除字典中的某个元素_python怎样删除字典中的元素
  4. NLP中对困惑度感到困惑?
  5. Swagger3.0
  6. [BUUCTF-pwn]——cmcc_pwnme1
  7. c语言函数 t啥意思,C语言函数大全(t开头)
  8. P2257-YY的GCD【莫比乌斯反演】
  9. C#中利用Expression表达式树进行多个Lambda表达式合并
  10. 数据库加一列,cursor:pointer
  11. python constructor_Python学习札记(2)——搭建Boa-constructor
  12. 版本设置X:none node Title golang版本错误
  13. 基于Androidstudio的2048小游戏的设计与实现
  14. Insyde uefi 隐藏设置_联想台式机10代cpu装win10及bios设置教程(新bios设置)
  15. win10无限重启服务器,Win10 1909系统解决电脑无限重启的方法
  16. 树莓派python编程入门与实战_树莓派Python编程入门与实战 PDF 下载
  17. 塔防类游戏性能优化分享
  18. Win10下执行mklink提示你没有足够权限执行此操作
  19. Windows下Ubuntu子系统,开启复制粘贴功能方法
  20. NAT 模式下网关设置

热门文章

  1. 单点登录之CAS SSO从入门到精通(第三天)
  2. 记录一下自己的本本,DELL 640M铲掉XP,重装VISTA的过程
  3. python人脸头发身体部位识别人数统计
  4. MinIO The access key ID you provided does not exist in our records问题解决
  5. iOS热更新方案(过AppStore审核)
  6. python基础-进制
  7. 软件开发README文档书写模板
  8. 微信链接跳转浏览器实现微信中直接下载棋牌游戏类APP功能
  9. Qt 使用阿里云字体图标
  10. 安装post man