有一个需求,需要进行限流,选择使用的Guava RateLimiter,但是发现在限流方面,还是存在一些问题(单机),特别是当瞬时访问量特别大的时候,
请看下面一个代码,应该输出什么结果?
package cn.ganlixin.guava;
import com.google.common.util.concurrent.RateLimiter;
import org.junit.Test;
import java.time.LocalTime;
public class UserRateLimiter {
@Test
public void testSimple() {
// 创建一个限流器(每秒限制流量为5个)
RateLimiter rateLimiter = RateLimiter.create(5.0);
for (int i = 0; i < 10; i++) {
if (rateLimiter.tryAcquire()) {
System.out.println(LocalTime.now() + " 通过");
} else {
System.out.println(LocalTime.now() + " 被限流");
}
}
}
}
运行上面的代码,输出结果如下:
15:05:37.655 通过 15:05:37.655 被限流 15:05:37.655 被限流 15:05:37.656 被限流 15:05:37.656 被限流 15:05:37.656 被限流 15:05:37.656 被限流 15:05:37.656 被限流 15:05:37.656 被限流 15:05:37.656 被限流
可以看到,上面的运行输出中,只有1个请求通过没有被限流,其余9个都被限流了。
这和我预期的结果有出入,预期应该是有5个通过,5个被限流。
原文:https://www.cnblogs.com/-beyond/p/12287219.html