当前位置: 首页 > 知识库问答 >
问题:

在Java中限制传出请求的速率,但具有动态速率

丁鹏鹍
2023-03-14

我正在构建一个应用程序,其中包括一个公共API的刮板。我想限制我的请求的速率,但不是固定的速率,而是一个动态的随机速率,它在请求之间变化,并且落在一定的范围内,即我可以设置请求之间的最小和最大延迟。

我也不想阻塞当前线程。

我研究了Guava Ratelimiter、RatelimitJ和令牌桶算法,但看了文档,我看不出这些东西是如何达到我想要的。

给定250-350ms的速率限制范围时,对我的请求所需效果的示例:

    null

共有1个答案

公冶森
2023-03-14

您不需要查看JDK之外的内容。您可以使用java.util.concurrent.ScheduleDexecutorService在定义的延迟之后并在单独的线程中进行调用。要使用它,您需要为执行API调用的代码实现java.util.concurrent.Callablejava.lang.Runnable

    ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
    Callable apiCaller = ...;

要使调用在定义的延迟后运行,请按以下方式提交:

    service.schedule(apiCaller, delay, TimeUnit.MILLISECONDS);

要获得随机延迟,只需使用java.util.random

        Random random = new Random();

Random可以为您提供一个有界整数。如果你给它一个可接受的范围,然后再加上最小值,你会得到一个介于最小值和最大值之间的随机数。

   int minimumDelay = 250;
   int maximumDelay = 350;       
   int delay = random.nextInt(maximumDelay - minimumDelay) + minimumDelay;
 类似资料:
  • 问题内容: 我正在用GRequests和lxml在Python 2.7.3中编写一个小脚本,这将允许我从各个网站收集一些可收集的卡价格并进行比较。问题是网站之一限制了请求的数量,如果我超过了它,则会发回HTTP错误429。 有没有一种方法可以限制GRequestes中的请求数量,以使我不超过我指定的每秒请求数量?另外-如果发生HTTP 429,如何让GRequestes在一段时间后重试? 附带说明

  • 我正在用Python 2.7.3编写一个小脚本,其中包含GRequests和lxml,它将允许我从各种网站收集一些可收集的卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回HTTP错误429。 有没有办法在grequests中增加限制请求数,这样我就不会超过我指定的每秒请求数?还有——如果HTTP 429出现,我如何让GRequestes在一段时间后重试? 另一方面,他们

  • 有人能详细说明酒吧/子系统实施的动态费率限制吗?我在gcloud文档或faq页面上找不到任何细节。 下面是我的pubsub用法:我计划在我们的生产中使用pubsub。现在,我有1个主题、1个订阅和1个订阅者(Webhook HTTPS回调)。有时我的订阅者可能会抛出异常(非常少),在这种情况下,我的订阅者将返回一个400响应给pubsub,以便pubsub可以保留消息并重试。 如果pubsub从用

  • 问题内容: API通常具有用户必须遵循的速率限制。举个例子,让我们50个请求/秒。连续的请求采取0.5-1秒,因此是来接近极限速度太慢。但是,使用aiohttp的并行请求超出了速率限制。 轮询API尽可能快地允许,需要限速并行调用。 例如,我发现到目前为止装饰,大约像这样: 这非常适用于连续通话。试图并行调用来实现这个按预期不起作用。 下面是一些代码示例: 这里的问题是,它会率限制 排队 的任务。

  • 我正在使用ProjectReactor使用rest从web服务加载数据。这是与多个线程并行完成的。我开始达到web服务的速率限制,因此我希望每秒最多发送10个请求,以避免出现这些错误。用Reactor我该怎么做? 使用zipWith(Mono.delayMillis(100))?还是有更好的办法? 非常感谢。

  • 我正在写一个网络爬虫,运行并行抓取许多不同的域。我想限制每秒向每个域发出的请求数量,但我不关心打开的连接总数,也不关心跨所有域发出的每秒请求总数。我想最大限度地增加打开连接和每秒请求的总数,同时限制对单个域的每秒请求数。 我可以找到的所有现有示例(1)限制打开连接的数量,或(2)限制在fetch循环中每秒发出的请求总数。例子包括: aiohttp:速率限制并行请求 它们都不做我要求的事情,即限制每