原 荐 聊聊leaky bucket算法的实现

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

原 荐 聊聊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算法的实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Pro Git

Pro Git

Scott Chacon / Apress / 2009-8-27 / USD 34.99

Git is the version control system developed by Linus Torvalds for Linux kernel development. It took the open source world by storm since its inception in 2005, and is used by small development shops a......一起来看看 《Pro Git》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具