`

漏桶算法和令牌桶算法

 
阅读更多

Google开源工具包Guava提供了限流工具类RateLimiter,该类基于令牌桶算法来完成限流,非常易于使用

 

常用的限流算法有两种:漏桶算法和令牌桶算法

      漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。

图1 漏桶算法示意图

      对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。如图2所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

图2 令牌桶算法示意图

 

 

在网络中传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。

 

令牌桶算法是 网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

 

大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。

 

传送到令牌桶的数据包需要消耗令牌。不同大小的数据包,消耗的令牌数量不一样。

 

令牌桶这种控制机制基于令牌桶中是否存在令牌来指示什么时候可以发送流量。令牌桶中的每一个令牌都代表一个字节。如果令牌桶中存在令牌,则允许发送流量;而如果令牌桶中不存在令牌,则不允许发送流量。因此,如果突发门限被合理地配置并且令牌桶中有足够的令牌,那么流量就可以以峰值速率发送。

 

令牌桶算法的基本过程如下:

 

假如用户配置的平均发送速率为r,则每隔1/r秒一个令牌被加入到桶中;

 

假设桶最多可以存发b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃;

 

当一个n个字节的 数据包到达时,就从令牌桶中删除n个令牌,并且 数据包被发送到网络;

 

如果令牌桶中少于n个令牌,那么不会删除令牌,并且认为这个数据包在 流量限制之外;

 

算法允许最长b个字节的突发,但从长期运行结果看, 数据包的速率被限制成常量r。对于在 流量限制外的 数据包可以以不同的方式处理:

 

它们可以被丢弃;

 

它们可以排放在 队列中以便当令牌桶中累积了足够多的令牌时再传输;

 

它们可以继续发送,但需要做特殊标记,网络过载的时候将这些特殊标记的包丢弃。

 

注意:令牌桶算法不能与另外一种常见算法“ 漏桶算法(Leaky Bucket)”相混淆。这两种算法的主要区别在于“ 漏桶算法”能够强行限制数据的传输速率,而“令牌桶算法”在能够限制数据的平均传输速率外,还允许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量。

分享到:
评论

相关推荐

    四大常用限流算法原理详解:计数器固定窗口、计数器滑动窗口、漏桶、令牌桶算法.pdf

    限流的常见实现算法有计数器固定窗口、计数器滑动窗口、漏桶算法和令牌桶算法。 1. 计数器固定窗口算法 计数器固定窗口算法的基本思想是在固定的时间窗口内,统计请求的数量。如果在该时间窗口内的请求次数超过了...

    标准令牌漏桶算法

    漏桶算法和令牌桶算法各有优劣。漏桶算法能强制限制最大速率,但不善于处理突发;令牌桶算法允许一定程度的突发,但可能造成令牌的浪费。在实际应用中,两者常常结合使用,以兼顾流量控制的稳定性和灵活性,为网络...

    经典限流算法-窗口算法、漏桶算法、令牌桶算法

    经典限流算法-窗口算法、漏桶算法、令牌桶算法

    令牌桶算法,漏桶算法,与计数器算法限流算法与Guava RateLimiter源码解析.docx

    本文重点讨论了三种限流算法:令牌桶算法、漏桶算法和计数器算法,并深入解析了Google Guava库中的RateLimiter类,它是基于令牌桶算法的实现。 1. **令牌桶算法**: - 令牌桶算法的核心思想是系统以恒定速率向桶中...

    Go-ratelimit基于令牌桶算法和漏桶算法来实现的限速限流Golang实现

    `ratelimit`库是一个实现了令牌桶算法和漏桶算法的Golang库,帮助开发者在应用中有效地实施流量控制。下面将详细探讨这两个算法及其在Golang中的实现。 ### 令牌桶算法 令牌桶算法是一种允许突发流量的流量整形和...

    基于令牌桶算法的Java限流实现

    常见的限流算法有多种,如漏桶算法、令牌桶算法、滑动窗口算法等。在Java中,我们可以使用令牌桶算法来实现限流机制。 基于令牌桶算法的Java限流实现是指使用令牌桶算法来控制系统的流量,使得系统的流量不超过设定...

    php 基于redis使用令牌桶算法实现流量控制

    系统在运行过程中,如遇上某些活动,访问的人数会在一瞬间内爆增,导致服务器瞬间压力飙升,使系统超...本文介绍php基于redis,使用令牌桶算法,实现访问流量的控制,提供完整算法说明及演示实例,方便大家学习使用。

    令牌桶算法的基本过程

    令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常用的算法之一。它通过控制数据接收和转发的速率来平滑网络数据流,并有效地实现突发数据流的传输。令牌桶算法在各种网络场景中被广泛应用...

    13 秒杀和限流的介绍1

    本篇文章将详细介绍基于Redis的秒杀方案以及两种限流算法:漏桶算法和令牌桶算法。 首先,让我们探讨基于Redis的秒杀方案。Redis因其单线程特性及原子性操作,成为了实现秒杀功能的理想选择。在秒杀场景中,库存的...

    Java限流实现

    其中,令牌桶算法和漏桶算法在实际应用中更为常见,它们通过控制流入和流出速率来实现限流。 1. **令牌桶算法**:系统以恒定的速度生成令牌放入桶中,请求需要消耗令牌才能执行,当桶中没有令牌时,请求会被拒绝或...

    计网作业31

    本篇主要讨论的是域内路由(Intra-Domain Routing)和域间路由(Inter-Domain Routing)的区别,以及在线视频会议与文件传输(FTP)应用对网络性能的要求,还有漏桶算法和令牌桶算法在网络流量控制中的作用。...

    基于redis限流系统.zip

    常见的限流算法有滑动窗口算法、漏桶算法和令牌桶算法。 这个项目采用了令牌桶算法的一种改进版。令牌桶算法通常包含两个主要元素:一个固定容量的桶和一个令牌生成器。系统会以恒定速率向桶内添加令牌,当请求到来...

    计算机网络网络学院要点PPT学习教案.pptx

    流量整形技术,如漏桶算法和令牌桶算法,被用来平滑突发性流量,保证网络流量以稳定的速率输出。漏桶算法简单但不够灵活,而令牌桶算法则引入了令牌机制,允许在网络空闲时积累发送权,以应对未来的突发数据。 总的...

    17.精确掌控并发:令牌桶算法在分布式环境下并发流量控制的设计与实现_V20240116.pdf

    - **令牌桶算法:** 结合了滑动窗口和漏桶算法的特点,既支持突发流量又保持了较好的流量平滑性。 #### 2. 令牌桶算法在支付系统中的应用 ##### 2.1 应用场景分析 在支付系统中,令牌桶算法常用于控制交易请求的...

    java-基于redis限流系统

    Redis提供了丰富的数据结构,如字符串、哈希表、列表、集合以及有序集合,这些都可以用来实现不同的限流算法,如滑动窗口算法、漏桶算法和令牌桶算法。 1. **滑动窗口算法**:它基于时间窗口对请求进行计数,超过...

    分布式锁+id生成器+限流工具

    常见的限流算法有滑动窗口算法、漏桶算法和令牌桶算法。其中,滑动窗口算法可以精确地控制在一段时间内的请求次数;漏桶算法适用于稳定流量的控制,而令牌桶算法则更适合应对突发流量。限流工具在API网关、微服务...

    35-流量控制:高并发系统中我们如何操纵流量?_For_group_share1

    在实际项目中,可以结合其他流量控制策略,如漏桶算法和令牌桶算法,以及更复杂的分布式限流解决方案,如Hystrix、Sentinel等,以实现更精细和强大的流量控制。这些工具和框架可以帮助开发者更好地管理和操纵流量,...

    java基于redis限流系统.rar

    限流主要通过限制请求速率或并发量来控制系统的处理能力,常见的限流算法有滑动窗口算法、漏桶算法和令牌桶算法。滑动窗口算法通常用于统计单位时间内的请求次数;漏桶算法则允许固定速率的请求流出,超出部分会被...

    【计算机网络】 第七章复习.pdf

    漏桶算法和令牌桶算法是两种常见的控制方法。漏桶算法是通过对数据传输速率的控制来避免突发流量的产生,而令牌桶算法则允许网络流量的突发传输,前提是令牌桶中有足够多的令牌。在虚电路拥塞控制中,还包括准入控制...

Global site tag (gtag.js) - Google Analytics