聊聊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 Algorithm
Leaky bucket algorithm for flow control
Computer Network | Leaky bucket algorithm

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理