番石榴RateLimiter热身澄清

时间:2016-02-09 18:02:42

标签: java guava

我正在试图找出一种方法来计算在特定时间会发生多少QPS,因为我正在使用带有warmpup的Guava ratelimiter。我阅读了评论here,但我仍然不清楚。希望有人可以为我澄清。

我的用例:

我拨打了一个限制为50 TPS的外部服务。需要注意的是,我们称之为的第一次~500次必须远远低于50 TPS,之后我们可以恢复50TPS。 (如果有比使用ratelimiter更好的解决方案,我很乐意听到它!)

伪码:

RateLimiter rateLimiter = RateLimiter.create(50.0, 10, minutes);
for (String customerId : customerList) {
    rateLimiter.acquire();
    // call external service
}

假设我们只用一个线程做这个。有没有办法计算在给定时间内TPS(QPS)的含量? 3分钟? 5分钟?等

1 个答案:

答案 0 :(得分:1)

具有RateLimiter的{​​{1}}的冷(最小)速率是稳定(最大)速率的1/3(这是从warmupPeriod硬编码到{{1}得出的在RateLimiter.java:147-184)中。在饱和需求(即不间断的许可请求)下,费率将以恒定速率增加,直至达到稳定(最大)费率。

由于这是linear equation,我们可以用coldFactor其中

的形式写出来
  • 3.0(a.k.a y = m * x + b)或y)是给定饱和期(例如3分钟)的预期QPS,
  • y(x)是从我们的冷(最低)费率到我们的稳定(最高)费率的变化率,
  • qps(t)(或m)是饱和需求下的已用时间,
  • x是我们的冷(最低)费率(我们稳定(最高)费率的1/3)。

完全相信我们t b

因此,对于您的示例,我们可以在3分钟内获得预期的QPS:

qps(t) = (stableRate - coldRate) / warmupPeriod * saturatedPeriod + coldRate

这是Java中的一个实现:

coldRate = stableRate / 3

请注意,在练习中使用单个线程时,您将无法满足qps(3) = (50.0 - 50.0/3.0) / 10.0 * 3.0 + 50.0/3.0 ~= 26.6666 的需求,因此您的实际QPS将略低于预期,并且很少(如果有的话)实际达到稳定(最大值)率。但是,使用多个线程将允许您始终拥有待处理的许可请求并使需求饱和。