原 荐 聊聊leaky bucket算法的实现

栏目: 编程工具 · 发布时间: 6年前

原 荐 聊聊leaky bucket算法的实现

聊聊leaky bucket算法的实现

  go4it 发布于 18分钟前

字数 441

阅读 4

收藏 0

21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> 原 荐 聊聊leaky bucket算法的实现

本文主要研究一下leaky bucket算法的实现

leaky bucket算法

  • bucket以一定速率滴水,相当于增加桶容量
  • bucket有其容量限制,请求过来时bucket满,则直接被抛弃
  • 请求到来时,如果bucket不满,则放入bucket,相当于放行

简单实现

public class LeakyBucket {

    private final long capacity;
    private final long leaksIntervalInMillis;

    private double used;
    private long lastLeakTimestamp;

    public LeakyBucket(long capacity, long leaksIntervalInMillis) {
        this.capacity = capacity;
        this.leaksIntervalInMillis = leaksIntervalInMillis;

        this.used = 0;
        this.lastLeakTimestamp = System.currentTimeMillis();
    }

    synchronized public boolean tryConsume(int drop) {
        leak();

        if (used + drop > capacity) {
           return false;
        }

        used = used + drop;
        return true;
    }

    private void leak() {
        long currentTimeMillis = System.currentTimeMillis();
        if (currentTimeMillis > lastLeakTimestamp) {
            long millisSinceLastLeak = currentTimeMillis - lastLeakTimestamp;
            long leaks = millisSinceLastLeak / leaksIntervalInMillis;
            if(leaks > 0){
                if(used <= leaks){
                    used = 0;
                }else{
                    used -= (int)leaks;
                }
                this.lastLeakTimestamp = currentTimeMillis;
            }
        }
    }
}
  • 这个实现设计了lastLeakTimestamp字段,用于计算时间差,以及在这个时间段内需要漏水的数量
  • 每次tryConsume的时候,方法内部首先调用leak,根据设定的速度以及时间差计算这个时间段需要漏水的数量,更新桶的当前使用量以及lastLeakTimestamp
  • 之后限流判断,就是判断used与请求的drop是否会超过桶容量,超出则限流,否则放入桶中,更新桶容量

小结

  • leaky bucket与token bucket算法相反,前者是漏水,后者是添加token
  • leaky bucket由于是漏水算法,所以不能像token bucket添加token那种可以累积,因此leaky bucket不能支持burst突发流量

doc

© 著作权归作者所有

共有人打赏支持

原 荐 聊聊leaky bucket算法的实现

go4it

粉丝 54

博文 714

码字总数 512168

作品 0

深圳

相关文章 最新文章

聊聊token bucket算法的实现

序 本文主要研究一下token bucket算法的实现 限流算法概述 主要有如下几种: 基于信号量Semaphore 只有数量维度,没有时间维度 基于fixed window 带上了时间维度,不过在两个窗口的临界点容易...

go4it

前天

0

0

nginx中的limit_req限速设置配置示例

WIKI: http://wiki.nginx.org/HttpLimitReqModule 漏桶原理(leaky bucket): http://en.wikipedia.org/wiki/Leakybucket 实例: ?...

zbill

06/29

0

0

emqttd 0.13.0 beta 发布,MQTT 消息服务器

emqttd 0.13.0-beta 版本正式发布。支持基于 Token Bucket/Leaky Bucket 算法的速率控制(Rate Limiting)。升级 esockd 库到3.0版本,支持参数化的Socke连接模块。改进MQTT TCP连接数据收发,...

emqtt

2015/11/09

1K

0

Nginx限速模块初探

Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有什么不同?本文将带你一探究竟。我们会通过一些简单的示例展示Nginx限速模块是如何工作...

a小鼠标

2017/12/25

0

0

原 荐 聊聊leaky bucket算法的实现
过载保护算法浅析

过载保护算法浅析 ShareCore2014-06-21538 阅读 算法 何为过载保护?所谓“过载”,即需求超过了负载能力;而“保护”则是指当“过载”发生了,采取必要的措施保护自己不受“伤害”。在计算机...

ShareCore

2014/06/21

0

0

没有更多内容

加载失败,请刷新页面

加载更多
线程安全和非线程安全

Non Thread Safe(nts)是指非线程安全,Thread Safe(ts)则是指线程安全。 nts和ts是多线程场景下才有的概念。在多线程场景下才有意义。 安全和非安全实质上指的是共享变量在一致性上是否会...

karma123

25分钟前

1

0

nodejs实践--模块Request学习

文章来自:Request —— 让 Node.js http请求变得超简单 先前一直比较关注前端的东西,对后端了解较少。不过一直对Node.js比较感兴趣,去年12月还去参加了阿里的CNODE交流聚会。 以后希望通过...

spinachgit

25分钟前

1

0

P2P

DemonsI

26分钟前

1

0

没有更多内容

加载失败,请刷新页面

加载更多

以上所述就是小编给大家介绍的《原 荐 聊聊leaky bucket算法的实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Docker开发指南

Docker开发指南

[英] Adrian Mouat / 黄彦邦 / 人民邮电出版社 / 2017-4 / 79.00元

Docker容器轻量和可移植的特性尤其适用于动态和分布式的环境,它的兴起给软件开发流程带来了一场革命。本书对Docker进行了全面讲解,包括开发、生产以至维护的整个软件生命周期,并对其中可能出现的一些问题进行了探讨,如软件版本差异、开发环境与生产环境的差异、系统安全问题,等等。一起来看看 《Docker开发指南》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换