文档章节

接口限流算法:漏桶算法和令牌桶算法

铁骨铮铮
 铁骨铮铮
发布于 05/23 20:48
字数 798
阅读 226
收藏 8

漏桶算法

漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。

把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。

需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。

令牌桶算法

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

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。

单机限流

Google的Guava包中的RateLimiter类就是令牌桶算法的解决方案。 首先说下单机限流

package yzy.guava.test;

import com.google.common.base.Optional;
import com.google.common.util.concurrent.RateLimiter;

import java.nio.channels.ServerSocketChannel;

public class OptionalTest {
    public void guava()
    {
        //guava
        Optional<Integer> possible = Optional.of(6);
        if(possible.isPresent())
        {
            System.out.println("possible isPresent:" +
                    possible.isPresent());
            System.out.println("possible value:" + possible.get());
            ServerSocketChannel s =null;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        OptionalTest hello = new OptionalTest();
        hello.guava();


        RateLimiter limiter = RateLimiter.create(1);//限制qps最大为1
        System.out.println(limiter.acquire()); //输出阻塞的时间

        Thread.sleep(2000);
        System.out.println(limiter.acquire() + " " + System.currentTimeMillis() / 1000 );

        System.out.println(limiter.acquire() + " " + System.currentTimeMillis() / 1000);

        System.out.println(limiter.acquire() + " " + System.currentTimeMillis() / 1000);



        System.out.println(limiter.acquire() + " " + System.currentTimeMillis() / 1000);
        System.out.println(limiter.acquire() + " " + System.currentTimeMillis() / 1000);

        System.out.println(limiter.acquire() + " " + System.currentTimeMillis() / 1000);

    }
}

分布式限流

基于Redis的分布式限流器可以用来在分布式环境下现在请求方的调用频率。既适用于不同Redisson实例下的多线程限流,也适用于相同Redisson实例下的多线程限流。该算法不保证公平性。

RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
// 初始化
// 最大流速 = 每1秒钟产生10个令牌
rateLimiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS);

// 获取4个令牌
rateLimiter.tryAcquire(4);

// 尝试获取4个令牌,尝试等待时间为2秒钟
rateLimiter.tryAcquire(4, 2, TimeUnit.SECONDS);

rateLimiter.tryAcquireAsync(2, 2, TimeUnit.SECONDS);

// 尝试获取1个令牌,等待时间不限
rateLimiter.acquire();

// 尝试获取1个令牌,等待时间不限
RFuture<Void> future = rateLimiter.acquireAsync();

© 著作权归作者所有

铁骨铮铮
粉丝 1
博文 39
码字总数 23637
作品 0
东城
私信 提问
接口限流算法:漏桶算法&令牌桶算法。

背景 每一个对外提供的API接口都是需要做流量控制的,不然会导致系统直接崩溃。很简单的例子,和保险丝的原理一样,如果用电符合超载就会烧断保险丝断掉电源以达到保护的作用。API限流的意义...

java技术栈
2017/11/14
0
0
游戏服务器架构系列 - 网关限流

为什么要进行网关限流? 在前面我们介绍的游戏服务端架构中,客户端通过Socket连接直连网关,所有请求都需要经过网关,然后由网关统一进行转发,为了避免玩家的DDOS攻击,所以需要在网关进行...

MaxwellGames
2018/10/30
0
0
流量调整和限流技术

漏桶算法:https://en.wikipedia.org/wiki/Leakybucket 它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供...

张舒歌
2016/12/11
372
0
Java编程——服务器设计方案之应用限流

前言 在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。 比如最近就有个这样的需求,我...

远方的梦Java
2018/08/02
0
0
sbc(四)应用限流

pexels-photo-306198.jpeg 前言 在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。 比...

crossoverJie
2017/08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

防止流量劫持有效途径-安装SSL证书

  在互联网的世界里,流量就等于金钱。而流量劫持是指,利用各种恶意软件、木马病毒,修改浏览器、锁定主页或不停弹出新窗口等方式,强制用户访问某些网站,从而造成用户流量损失的情形。 ...

安信SSL证书
16分钟前
2
0
关于工作流程数据模版的设置与使用.

关键字:ccbpm数据模版 解释说明:数据模版就是当前工作人员历史发起的历史流程里,把一些具有代表性的设置为模版,下次在启动流程的时候,选择模版里的数据在发起流程,避免重复数据录入的工...

ccflow周朋
30分钟前
4
0
第一个只出现一次的字符

处理字符串中重复或者次数出现等问题,最常用的就是哈希表,用字符串中的字符作为key,字符出现次数作为value,假定只有ASCII码范围内的字符,则可以开辟一个256大小的int数组,将每个字符(...

Garphy
30分钟前
6
0
通过构建区块链来学习区块链-1-Transaction|Block|POW

原文链接:https://medium.com/@vanflymen/learn-blockchains-by-building-one-117428612f46 交易Transaction 区块Block 工作量证明 你来这里是因为,和我一样,你对加密货币的崛起感到兴奋。...

Riverzhou
37分钟前
4
0
大数据最核心的关键技术——32个算法,记得收藏!

奥地利符号计算研究所的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结...

大数据金罗
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部