该限流算法的实现导致拒绝请求不是猜测,为真实地在生产环境中碰到的场景。
修复如下:
```java
class StatItem {
private String name;
private long interval;
private int rate;
private final AtomicInteger token;
private final ScheduledExecutorService scheduler;
public StatItem(String name, int rate, long interval) {
this.name = name;
this.rate = rate;
this.interval = interval;
this.token = new AtomicInteger(rate);
this.scheduler = Executors
.newSingleThreadScheduledExecutor(new
NamedThreadFactory("token-schedule"));
this.scheduler.scheduleAtFixedRate(() -> {
resetToken(this.rate);
}, 0, this.interval, TimeUnit.MILLISECONDS);
}
private void resetToken(int rate) {
this.token.set(rate);
}
public boolean isAllowable() {
return token.decrementAndGet() >= 0;
}
}
```
修复:采用一个异步线程定期(interval间隔)去重置令牌桶,而不再依赖于系统时间。但增加了一个线程的开销。
[ Full content available at:
https://github.com/apache/incubator-dubbo/issues/2345 ]
This message was relayed via gitbox.apache.org for [email protected]