2017-06-02 80 views
0

我一直玩弄一个打击系统,并偶然发现了番石榴RateLimiter。从我可以告诉它处理节流的两种主要方式是通过排队请求(.acquire(...)方法)或通过丢弃它们(tryAcquire(...)方法)番石榴RateLimiter爆裂

我是认为会有一个选项允许请求达到指定的数量,并且只有在达到所述限制队列或放弃请求之后。

例如:

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

这将然后打印出五声蜂鸣声,忽略未来五年,然后重新再打印五

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

您提供输入发出蜂鸣声以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将ř意味着它开始接受异步任务,这听起来不像是一种自然的责任,所以它可能会造成糟糕的设计。

+0

我们不想为它添加固定大小的队列。我只希望它在时间段Y内接受第一个X请求。然后忽略或排队下一个包含的消息(根据已有的功能)。一旦间隔结束,再次接受X并重复。 希望它是有道理的? – Rhed