java - Guava RateLimiter 爆破

标签 java guava throttling

我一直在研究 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/

相关文章:

java - 我们应该如何在java多线程代码中使用JPMML评估器的modelEvaluator?

java - 基于 3 个不同的整数创建一个唯一的整数

java - 我可以使用反射发现 Java 类的声明内部类吗?

queue - 分布式限速

java - 使 Canvas 的画线可点击

java - 从嵌套结构中删除谓词(google guava 谓词)

java - 为什么 guava 21.0 版本中的 Maps 不采用 java.util.function.Function 等作为参数?

java - Guava:将 Multimap 转换为通用父类(super class)型是否有效?

ios - 在 Swift 中 throttle 而不 react

throttling - 处理亚马逊产品广告 API 限制