序本文主要研究一下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算法相反,前者是漏水,后者是添加tokenleaky bucket由于是漏水算法,所以不能像token bucket添加token那种可以累积,因此leaky bucket不能支持burst突发流量docLeaky Bucket AlgorithmLeaky bucket algorithm for flow controlComputer Network | Leaky bucket algorithm