番石榴RateLimiter爆破

时间:2017-06-02 09:18:44

标签: java guava throttling

我一直在玩一个thottling系统,偶然发现了番石榴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

1 个答案:

答案 0 :(得分:1)

  

然后打印出五声嘟嘟声,省略接下来的五声,然后再打印五声

添加固定大小的队列确实不会让它以这种方式工作。

您以每秒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责任,因此它可能会造成糟糕的设计。