该限流算法的实现导致拒绝请求不是猜测,为真实地在生产环境中碰到的场景。
修复如下:
```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]

Reply via email to