gpt4 book ai didi

java - Guava 速率限制器发送更多的 qps

转载 作者:太空宇宙 更新时间:2023-11-04 10:28:44 25 4
gpt4 key购买 nike

我正在使用 Guava 速率限制器来限制每秒发送的消息 5000 条。我取得了良好的结果,但有时当 Guava 速率限制器在一秒内发送较少的记录时,剩下的记录会在另一秒内发送,假设在 1 秒内发送 1000 条消息,在另一秒内发送 9000 条消息,但我每秒只需要发送 5K 消息。如果它在一秒钟内发送 2000 条消息,在另一秒钟内它不应该超过 5k,我必须使用之前的 3k 消息,并且需要为当前秒添加其他 2K 消息。使用的代码如下

RateLimiter limiter = RateLimiter.create(5000.0);

for (int i = 0; i < msisdnSize; i++) {limiter.acquire();//sends message}

tried this as well

limiter.acquire();
for (int i = 0; i < msisdnSize; i++) { //sends message }

在这两种情况下我都没有达到期望的 QPS

最佳答案

假设第一个示例中的 //sends message 注释意味着您的实际程序具有在该注释所在的位置发送消息的代码,那么我认为第一个示例看起来是正确的。

不确定问题是什么,以下常规代码在功能上或多或少与您的第一个案例相同:

@Grab('com.google.guava:guava:20.0')
import com.google.common.util.concurrent.RateLimiter

long start = System.currentTimeMillis()
long count = 0
RateLimiter limiter = RateLimiter.create(5000.0)
while (true) {
limiter.acquire()
count++
long now = System.currentTimeMillis()
long delta = now - start
if (delta >= 1000) {
println "sent $count messages in ${delta}ms"
count = 0
start = now
}
}

(代码运行无限循环,调用获取每次迭代并每秒打印一次迭代次数)给出以下输出:

    sent 4958 messages in 1000ms
sent 5001 messages in 1000ms
sent 5002 messages in 1000ms
sent 5003 messages in 1001ms
sent 5004 messages in 1000ms
sent 4996 messages in 1000ms
sent 5004 messages in 1000ms
sent 5001 messages in 1001ms
sent 5003 messages in 1000ms
sent 5003 messages in 1001ms
sent 5002 messages in 1000ms

即,由于 RateLimiter 的设计方式(昂贵的操作后的获取付出了代价),代码有时会超出限制,但通常或多或少保持在正确的数字附近。

我猜测还有其他因素会影响您的数字。例如,您是否正在计算已完成请求的数量?

换句话说,速率限制器允许您在第一秒发出 5000 个请求,在第二秒发出 5000 个请求,但如果另一端处理请求的服务器只是将它们排队并在第三秒响应所有 10000 个请求(并且您正在计算已完成的请求),那么很可能会给您留下速率限制器已损坏的印象。

只是我的 2c,无论如何都不是结论性的答案。

关于java - Guava 速率限制器发送更多的 qps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com