Guava RateLimiter预热模型

这篇具有很好参考价值的文章主要介绍了Guava RateLimiter预热模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

什么是流量预热

我们都知道在做运动之前先得来几组拉伸之类的动作,给身体做个热身,让我们的身体平滑过渡到后面的剧烈运动中。流量预热也是一样的道理,对限流组件来说,流量预热就类似于一种热身运动,它可以动态调整令牌发放速度,让流量变化更加平滑。

我们来举一个例子:某个接口设定了100个Request每秒的限流标准 ,同时使用令牌桶算法做限流。假如当前时间窗口内都没有Reques t过来,那么令牌桶中会装满100个令牌。如果在下一秒突然涌入100个请求,这些请求会迅速消耗令牌,对服务的瞬时冲击会比较大。因此我们需要一种类似“热身运动”的缓冲机制,根据桶内的令牌数量动态控制令牌的发放速率,让忙时流量和闲时流量可以互相平滑过渡。

流量预热的做法

我们以Guava中的RateLimiter为例,看看流量预热在RateLimiter中是如何运作的,我们用下面的状态转换图来展示整个过程:

Guava RateLimiter预热模型,分布式,guava,RateLimiter,流量预热

横坐标是令牌桶的当前容量,纵坐标是令牌发放速率,我们先从横坐标来分析

横坐标

下面两种场景会导致横坐标的变化:

  1. 闲时流量流量较小或者压根没流量的时候,横坐标会逐渐向右移动,表示令牌桶中令牌数量增多
  2. 忙时流量当访问流量增大的时候,横坐标向左移动,令牌桶中令牌数量变少

横轴有两个重要的坐标,一个是最右侧的“令牌桶最大容量”,这个不难理解。还有一个是Half容量,它是一个关键节点,会影响令牌发放速率。

纵坐标

纵坐标表示令牌的发放速率,这里有3个标线,分别是稳定时间间隔,2倍间隔,3倍间隔。

这里间隔的意思就是隔多长时间发放一个令牌,而所谓稳定间隔就是一个基准时间间隔。假如我们设置了每秒10个令牌的限流规则,那么稳定间隔也就是1s/10=0.1秒,也就是说每隔0.1秒发一个令牌。相应的,3倍间隔的数值是用稳定间隔乘以系数3,比如上面这个例子中3倍间隔就是0.3秒。

运作模式

了解了横坐标和纵坐标的含义之后,让我们来试着理解预热模型的用例。继续沿用上面10r/s的限流设置,稳定间隔=0.1s,3x间隔是0.3s。

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

反过来也一样,在流量从忙时转变为闲时的过程中,令牌发放速率是由快到慢逐渐变化。起始阶段的令牌放行间隔是0.1s,随着令牌桶内令牌逐渐增多,当令牌的存量积累到最大容量的一半后,放行令牌的时间间隔进一步增大为0.3s。

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

核心代码

理解了预热模型的运作流程之后,我们来看一下具体代码是如何实现的。

实现流量预热的类是SmoothWarmingUp,它是SmoothRateLimiter的一个内部类,我们重点关注一个doSetRate方法,它是计算横纵坐标系关键节点的方法,先来看一下SmoothRateLimiter这个父类中定义的方法

//permitsPerSecond表示每秒可以发放的令牌数量
@Override
final void doSetRate(double permitsPerSecond, long nowMicros) {
  resync(nowMicros);
  
  //计算稳定间隔,使用1s除以令牌桶容量
  double stableIntervalMicros = SECONDS.toMicros(1L);
  this.stableIntervalMicros = stableIntervalMicros;
  
  //调用SmoothWarmingUp类中重载的doSetRate方法
  doSetRate(permitsPerSecond, stableIntervalMicros); 
}

父类在这里的作用主要是计算出了稳定时间间隔(使用1s/每秒放行数量的公式来计算得出),然后预热时间、三倍间隔等是在子类的doSetRate方法中实现的。

接下来我们看子类SmoothWarmingUp中的doSetRate做了什么

@Override
void doSetRate(double permitsPerSecond, double stableIn tervalMicros) {
  double oldMaxPermits = maxPermits;
  
  //maxPermits表示令牌桶内最大容量,它由我们设置的预热时间除以稳定时间间隔
  maxPermits = warmupPeriodMicros / stableIntervalMicros

  //这句不用解释了吧,halfPermits是最大容量的一半halfPermits =maxPermits / 2.0;
  // coldIntervalMicros就是我们前面写到的3倍间隔,通过稳定间//稳定间隔是0.1,3倍间隔是0.2,那么平均间隔是0.2
  double coldIntervalMicros = stableIntervalMicros * 3

  //slope的意思是斜率,也就是前面我们图中预热阶段中画出的斜线//它的计算过程就是一个简单的求斜率公式
  slope = (coldIntervalMicros - stableIntervalMicros)

  //计算目前令牌桶的令牌个数
  if (oldMaxPermits == Double.POSITIVE_INFINITY) {
    //如果令牌桶最大容量是无穷大,则设置当前可用令牌数为0 //说实话这段逻辑没什么用
    storedPermits = 0.0;
  } else {
    storedPermits = (oldMaxPermits == 0.0) 
      ? maxPermits//初始化的状态是3x间隔
      : storedPermits * maxPermits / oldMaxPermits;
  }
}

通过上面的两个函数,RateLimiter限流器就对maxPermitsslope(预热期斜率)两个变量做了初始化配置。我把关键步骤都注释在了代码里,大家理解了之后,可以尝试去阅读这个类的其他方法,弄清maxPermitsslope是如何影响令牌发放速率的。文章来源地址https://www.toymoban.com/news/detail-802694.html

到了这里,关于Guava RateLimiter预热模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java进行系统的限流实现--Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶

    本文主要介绍了几种限流方法:Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶,漏桶算法和nginx限流等等 1、引入guava集成的工具 pom.xml 文件 demo代码实现 2.令牌桶算法 3、滑窗计数器 4、信号量

    2024年02月09日
    浏览(29)
  • 自定义redission装配和集成分布式开源限流业务组件ratelimiter-spring-boot-starter的正确姿势

    自定义redission装配和集成分布式开源限流业务组件ratelimiter-spring-boot-starter的正确姿势   由于使用了redisson-spring-boot-starter,在自定义redisson装配的时候会被redisson-spring-boot-starter里面的start默认装配了,同时在使用开源分布式限流组件ratelimiter-spring-boot-starter的时候,这个里面

    2024年02月07日
    浏览(39)
  • 【分布式】大模型分布式训练入门与实践 - 04

    【分布式】NCCL部署与测试 - 01 【分布式】入门级NCCL多机并行实践 - 02 【分布式】小白看Ring算法 - 03 【分布式】大模型分布式训练入门与实践 - 04 数据并行(Distributed Data Parallel)是一种用于加快深度学习模型训练速度的技术。在过去,训练大型模型往往受限于单卡训练的瓶颈

    2024年02月08日
    浏览(31)
  • 【分布式训练】基于PyTorch进行多GPU分布式模型训练(补充)

    简介: 在PyTorch中使用DistributedDataParallel进行多GPU分布式模型训练。 原文链接:https://towardsdatascience.com/distributed-model-training-in-pytorch-using-distributeddataparallel-d3d3864dc2a7 随着以ChatGPT为代表的大模型的不断涌现,如何在合理的时间内训练大模型逐渐成为一个重要的研究课题。为了解

    2024年02月16日
    浏览(37)
  • 算法、语言混编、分布式锁与分布式ID、IO模型

    数据结构和算法是程序的基石。我们使用的所有数据类型就是一种数据结构(数据的组织形式),写的程序逻辑就是算法。 算法是指用来操作数据、解决程序问题的一组方法。 对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源(空间

    2024年02月08日
    浏览(35)
  • 分布式存储测试模型

    分布式存储测试模型 (1) Cosbench 可以通过对象接口,模拟对象数据访问时数据高并发以及大带宽写入数据时海量小文件数据写入的 OPS( 每秒可以读取或者写入的文件数量 ) 以及大容量数据写入时的带宽 ( 每秒写入和读取的数据量 ) 性能。 (2) Vdbench 可 基 于 文 件 系 统, 模 拟

    2024年02月11日
    浏览(40)
  • 分布式链路追踪专栏,Spring Cloud Sleuth:分布式链路追踪之通信模型设计

    Spring Cloud Sleuth  赋予分布式跟踪的  Spring Boot  自动配置的一键解决方案。 Spring Cloud Sleuth  是基于  Brave  的封装,也是很多公司采用开源加自研的最佳解决方案。 那么从作为架构师或者技术专家如何去借鉴优秀框架的设计理念和思想,本次  Chat  将开启作者既分布式链路

    2024年01月19日
    浏览(57)
  • 大语言模型的分布式训练

    什么是大语言模型 训练方式 面临的挑战 什么是分布式计算 如何实现 拆分逻辑 分发逻辑 大语言模型的分布式训练 数据并行 模型并行 流水线并行 张量并行 通信 PS NCCL是Nvidia Collective multi-GPU Communication Library的简称,它是一个实现多GPU的collective communication通信(all-gather, red

    2024年02月10日
    浏览(37)
  • ET介绍——分布式Actor模型

    在讨论Actor模型之前先要讨论下ET的架构,游戏服务器为了利用多核一般有两种架构,单线程多进程跟单进程多线程架构。两种架构本质上其实区别不大,因为游戏逻辑开发都需要用单线程,即使是单进程多线程架构,也要用一定的方法保证单线程开发逻辑。ET采用的是单线程

    2024年02月05日
    浏览(25)
  • 大模型学习笔记08——分布式训练

    模型规模的扩大,对硬件(算力、内存)的发展提出要求。然而,因为内存墙的存在,单一设备的算力及容量,受限于物理定律,持续提高芯片的集成越来越困难,难以跟上模型扩大的需求。 为了解决算力增速不足的问题,人们考虑用多节点集群进行分布式训练,以提升算力

    2024年01月23日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包