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

最佳答案

然后将打印出五声哔声,省略下五声,然后再次打印五声


添加固定大小的队列并不能真正使它以这种方式工作。

您以每秒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职责,因此可能会设计不好。

09-28 09:59