令牌桶(Token Bucket)

摘要:
令牌桶算法是存储固定容量令牌的桶,并以固定速率向桶中添加令牌。令牌桶算法基本上可以用以下概念来描述:令牌将以固定的速率放入令牌桶。令牌算法根据放置令牌的速率(即上图中的色调网络的速率)控制输出速率。To network可以理解为消息处理程序,它执行某个业务段或调用RPC。在“令牌桶算法”中,只要令牌桶中有令牌,就允许以突发方式传输数据,直到达到用户配置的阈值,因此适合具有突发特征的流量。

概要

  限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。

令牌桶算法

  令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 当桶满时,新添加的令牌被丢弃或拒绝。

令牌桶算法是一个存放固定容量令牌(token)的桶,按照固定速率往桶里添加令牌。令牌桶算法基本可以用下面的几个概念来描述:

  • 令牌将按照固定的速率被放入令牌桶中。比如每秒放10个。
  • 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝。
  • 当一个n个字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上。
  • 如果桶中的令牌不足n个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么缓冲区等待)。
令牌桶(Token Bucket)第1张

令牌算法是根据放令牌的速率去控制输出的速率,也就是上图的to network的速率。to network我们可以理解为消息的处理程序,执行某段业务或者调用某个RPC。

​通俗的理解,令牌桶是一个水桶,而令牌是通过一根水管流到水桶中的水

    ​    ​令牌桶的填满时间,是由桶的自身容量、令牌漏出速率(桶下面的水管)、超过平均速率的突发流量持续的时间三个方面共同决定的。如果突发流量的时间比较短,令牌桶不会溢出,在通信流上不会受到影响,如果突发流量比较大,时间比较长,那令牌桶就会溢出,多余的通信流就会被限制。

 

​令牌桶算法和漏桶算法的区别

  主要区别在于“漏桶算法”能够强行限制数据的传输速率,而“令牌桶算法”在能够限制数据的平均传输速率外,还允许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量。

 

redis 实现

"local function addToQueue(x, time)"
+ " local count = 0"
+ " for i = 1, x, 1 do"
+ " redis.call('lpush', KEYS[1], time)"
+ " count = count + 1"
+ " end"
+ " return count"
+ "end"
+ "local result = 0"
+ "local timeBase = redis.call('lindex', KEYS[1], tonumber(ARGV[2]) - tonumber(ARGV[1]))"
+ "if (timeBase == false) or (tonumber(ARGV[4]) - tonumber(timeBase) > tonumber(ARGV[3])) then"
+ " result = result + addToQueue(tonumber(ARGV[1]), tonumber(ARGV[4]))"
+ "end"
+ "if (timeBase ~= false) then"
+ " redis.call('ltrim', KEYS[1], 0, tonumber(ARGV[2]))"
+ "end"
+ "return result"
;

 

使用RateLimiter完成简单的大流量限流

    import com.google.common.util.concurrent.RateLimiter;  
      
    import java.util.ArrayList;  
    import java.util.List;  
    import java.util.concurrent.ExecutorService;  
    import java.util.concurrent.Executors;  
      
    /** 
     *
     * 有很多个任务,但希望每秒不超过X个,可用此类 
     */  
    public class Demo {  
      
        public static void main(String[] args) {  
            //0.5代表一秒最多多少个  
            RateLimiter rateLimiter = RateLimiter.create(0.5);  
            List<Runnable> tasks = new ArrayList<Runnable>();  
            for (int i = 0; i < 10; i++) {  
                tasks.add(new UserRequest(i));  
            }  
            ExecutorService threadPool = Executors.newCachedThreadPool();  
            for (Runnable runnable : tasks) {  
                System.out.println("等待时间:" + rateLimiter.acquire());  
                threadPool.execute(runnable);  
            }  
        }  
      
        private static class UserRequest implements Runnable {  
            private int id;  
      
            public UserRequest(int id) {  
                this.id = id;  
            }  
      
            public void run() {  
                System.out.println(id);  
            }  
        }  
      
    }  

  

免责声明:文章转载自《令牌桶(Token Bucket)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Jmeter之计数器你真的会使用assert吗?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux查看实时网卡流量的几种方式

Linux查看实时网卡流量的几种方式 来源  https://www.jianshu.com/p/b9e942f3682c 在工作中,我们经常需要查看服务器的实时网卡流量。通常,我们会通过这几种方式查看Linux服务器的实时网卡流量。 1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众多统计数据。其在不同的系统上命令...

深度包检测(DPI)详细介绍

目录 简介 背景 流量识别常用功能 具体功能做法 特征识别 架构举例 部署方式 串接方式 并接方式 存在问题 检测引擎举例 参考文献 简介 DPI(Deep Packet Inspection)深度包检测技术是在传统IP数据包检测技术(OSI L2-L4之间包含的数据包元素的检测分析)之上增加了对应用层数据的应用协议识别,数据包内...

【Guava】使用Guava的RateLimiter做限流

一、常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法。 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出,漏桶算法可以强制限制数据的传输速度。 2.令牌桶算法 令牌桶算法的原理是系统以一定速率向桶中放入令牌,如果有请求时,请求会从桶中取出令牌,如果能取到令牌,则可以继续完成请求...

服务器流量异常排查步骤(查看进程的流量)

在工作中经常遇到服务器流量异常,时不时的流量很高,今天就是一台服务器的内网端口的流量很短时间内达到了50Mbps,下面是我排查问题的方法和步骤,记录一下。 1.使用iftop -P 确定哪个进程的流量比较大 或者使用iptraf,jnettop  请读者自行研究 可以看出来api-node3:58218 的进程流量最大。下一步要根据端口号确定对应的进程P...

Malleable-C2-Profiles配置

唔,水文水文…. 关于Malleable-C2-Profiles 在日常的渗透测试工作中,我们需要做很多的规避操作,因为我们所使用的C2工具等,可能早已被AV等防护软件所标记,所以我们需要订制我们的攻击工具。而这就引出了我们的今天的重点Malleable C2 ,Malleable C2 是 Cobalt Strike 的一项功能, 意为 “可定制的” 的...

Gateway Redis令牌桶请求限流过滤器

spring cloud gateway默认基于redis令牌桶算法进行微服务的限流保护,采用RateLimter限流算法来实现。 1.引入依赖包 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spr...