我正在试图找出一种方法来计算在特定时间会发生多少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分钟?等
答案 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将略低于预期,并且很少(如果有的话)实际达到稳定(最大值)率。但是,使用多个线程将允许您始终拥有待处理的许可请求并使需求饱和。