我一直在研究 throttle 系统,并偶然发现了 Guava RateLimiter。据我所知,它处理限制的两种主要方式是对溢出的请求进行排队(.acquire(...) 方法)或丢弃它们(tryAcquire(...) 方法)
我认为会有一个选项允许请求达到指定数量,并且仅在达到所述限制队列或丢弃请求后才允许。
例如:
public static void main( String[] args )
{
try
{
RateLimiter limiter = RateLimiter.create(5.0 );
//fictive call not saying it should be implemented this way
limiter.allowBursts(true);
for( int i = 0; i < 20; i++ )
{
Thread.sleep( 100 );
performOperation( limiter );
}
}
catch( InterruptedException e )
{
e.printStackTrace();
}
}
private static void performOperation( RateLimiter limiter )
{
if( limiter.tryAcquire() )
{
System.out.println( Instant.now() + ": Beep" );
}
}
这将打印出五声蜂鸣声,省略接下来的五声,然后再次打印五声
我是唯一一个认为这是一项有用的功能的人吗?还是我没有捕获重点?
测试代码由以下人员提供: Throttling method calls using Guava RateLimiter class
最佳答案
This would then print out five beeps, omit the next five and then print five again
添加固定大小的队列并不能真正使其以这种方式工作。
您以每秒 10 次的固定速率发出输入蜂鸣声, 因此添加 5 个输入队列只会分摊最初的 10 声蜂鸣声, 然后它将开始跳过所有其他蜂鸣声,如下所示:
1
2
3
4
5
6
7
8
9
10
12
14
16
18
20
这(除了那些第一个元素)与原始 RateLimiter
已经执行的操作没有什么不同:
1
3
5
7
9
11
13
15
17
19
此外,向 RateLimiter
添加队列将要求它开始接受异步任务,这听起来并不像是自然的 RateLimiter
职责,因此它可能会产生糟糕的设计。
关于java - Guava RateLimiter 爆破,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325219/