如何管理请求有限的API调用

时间:2012-11-05 17:30:33

标签: php mysql sql api rate-limiting

我正在使用对请求有新限制的tmdb API,即每个IP 10秒内有30个请求。我可以通过在MySQL中拥有一个表来跟踪这些调用,该表包含过去10秒内的请求数量但是如何使用不同的IP地址实现此目的呢?

我的应用程序的工作方式是:

  1. 从桌面应用程序向应用程序服务器发出请求。然后,服务器端php进行搜索并返回数据。

  2. 桌面应用然后对app服务器进行不同的调用,然后轮流对tmdb(4-7)和其他api进行几次api调用。

  3. 在某些情况下,从少数搜索请求到几千个搜索请求。跟踪和延迟api呼叫以保持低于限制的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

如果您的服务器向具有速率限制的另一台服务器发送请求,您将需要一种全局方式来跟踪服务器的请求,无论哪个客户端向您的服务器发出请求等。

我会使用平面文件,并为每个请求保存unix时间和分隔符,如果文件中包含10个,那么您已经完成了10个请求,并且您需要清理文件并删除任何超过十秒的时间戳,这将为您提供最简单的PHP速率限制器形式。

当然有更高级的方法,但我会从那里开始,并确保您对其进行测试,以免丢失您的API访问权限等。

答案 1 :(得分:1)

您可以使用php sleep功能来限制发出请求的速率。或者确实使用像usleep函数这样的东西,通过给出你希望延迟的微秒数来停止。

答案 2 :(得分:0)

token bucket algorithm可以进行速率限制。我为您创建了一个带有共享存储的线程安全实现:bandwidth-throttle/token-bucket

此示例将应用程序限制为每秒3个请求的全局消耗率:

use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\BlockingConsumer;
use bandwidthThrottle\tokenBucket\storage\PDOStorage;

$storage  = new PDOStorate("tmdb", $pdo);
$rate     = new Rate(3, Rate::SECOND);
$bucket   = new TokenBucket(30, $rate, $storage);
$consumer = new BlockingConsumer($bucket);
$bucket->bootstrap(30);

$consumer->consume(1);
$api->foo();